您的位置:首页 > 编程语言 > Java开发

java invoke 反射机制实现演练

2017-06-16 09:47 369 查看

1反射机制是什么

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

2运用原理

在web转发时候可以根据前台传来的ServiceId 和 ServiceAction去寻找所对应的服务和方法名。从而寻找到处理业务逻辑的具体Service和具体方法实现去执行。

实战演练

package invoke;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/***
* java 反射机制实战
* @author Administrator
*
*/
public class TestIvoke {

public void doSomething(Map<String, Object> name1,String name2,Object name3){
System.out.println("doSomething");
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//第一步 先得到TestIvoke 类的class  或者cls =	TestIvoke.class
Class   cls = 	TestIvoke.class ;
//					Class.forName("TestIvoke");
//模拟传入的参数
Map<String, Object> name1 = new HashMap<String, Object>();
String name2 = new String();
Object name3 = new Object();
//用来存放三个参数
List<Object> params = new ArrayList<Object>();
params.add(name1);
params.add(name2);
params.add(name3);
//用来存放三个参数的类型
List<Class<?>> parameterTypes = new ArrayList<Class<?>>();
Iterator<Object> it = params.iterator();
while (it.hasNext()) {
Object object = it.next();
if(object instanceof Map){//由于上面定义了name1 为HashMap 类型 这边要强制
parameterTypes.add(Map.class);
}else{
parameterTypes.add(object.getClass());
}

}
System.out.println(parameterTypes.toArray(new Class<?>[parameterTypes.size()])[1]);
//获得medhod class中的具体方法
Method method = cls.getDeclaredMethod("doSomething",
parameterTypes.toArray(new Class<?>[parameterTypes.size()]));
try {
//methon反射  构建新对象,传入参数
//或者 method.invoke( new TestIvoke() , params.toArray(new Object[params.size()]));
method.invoke(new TestIvoke(), params.toArray(new Object[params.size()]));
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

 最后输出为

doSomething

将反射机制应用于工厂模式

* 对于普通的工厂模式当我们在添加一个子类的时候,就需要对应的修改工厂类。 当我们添加很多的子类的时候,会很麻烦。
package net.xsoftlab.baike;
interface fruit {
    public abstract void eat();
}
class Apple implements fruit {
    public void eat() {
        System.out.println("Apple");
    }
}
class Orange implements fruit {
    public void eat() {
        System.out.println("Orange");
    }
}
class Factory {
    public static fruit getInstance(String ClassName) {
        fruit f = null;
        try {
            f = (fruit) Class.forName(ClassName).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return f;
    }
}
/**
 * 对于普通的工厂模式当我们在添加一个子类的时候,就需要对应的修改工厂类。 当我们添加很多的子类的时候,会很麻烦。
 * Java 工厂模式可以参考
 * http://baike.xsoftlab.net/view/java-factory-pattern  * 
 * 现在我们利用反射机制实现工厂模式,可以在不修改工厂类的情况下添加任意多个子类。
 * 
 * 但是有一点仍然很麻烦,就是需要知道完整的包名和类名,这里可以使用properties配置文件来完成。
 * 
 * java 读取 properties 配置文件 的方法可以参考
 * http://baike.xsoftlab.net/view/java-read-the-properties-configuration-file  * 
 * @author xsoftlab.net
 */
public class TestReflect {
    public static void main(String[] args) throws Exception {
        fruit f = Factory.getInstance("net.xsoftlab.baike.Apple");
        if (f != null) {
            f.eat();
        }
    }
}
代码和解释都是自己一个个敲出来的,如果大家觉得有用就请顶一下吧。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  class java