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();
}
}
}
代码和解释都是自己一个个敲出来的,如果大家觉得有用就请顶一下吧。
相关文章推荐
- 利用Java的反射与代理机制实现AOP
- java中的反射机制中invoke典型用法
- java中基于线程池和反射机制实现定时任务
- Java进阶(极客)——反射机制(一)概述及Class 对象的机制与实现
- 使用反射实现Java下的委托机制
- 利用Java的反射与代理机制实现IOC
- JAVA 反射机制实现 reflect
- java 利用泛性和反射机制实现collections.sort排序模板
- 利用Java的反射与代理机制实现AOP
- 通过java的反射机制实现Map、JavaBean、JSON的相互转换工具类
- java的反射与内省机制的实现
- java中利用反射机制实现调用给定为字符串的方法名
- Java 反射机制模拟hibernate实现持久化
- java invoke 反射机制的使用
- Java 反射机制初探(一)--仿hibernate持久化实现
- 一个新的对象创建机制的思考--C++下实现类似于Java的对象管理机制及反射
- java 反射机制实现对象复制
- JAVA提供一种反射机制可以实现
- java利用反射实现Object-c中的KVC机制
- java利用反射机制模拟spring IOC实现