自己学习java reflect体会
???? 以前一直没有机会学习Java reflect,可能有机会也错过了吧。这一次利用晚上的时间好好的看看了一下。发现还不错,现在把体会写下来。我用的是JDK1.5的版本上做的实例。
???? 核心的,经常用的工具为:
???? java.lang.reflect.Field --代表类的属性,
???? java.lang.reflect.Method--代表类的方法,
?????java.lang.reflect.Constructor--代表类的构造方法,
???? java.lang.Class--代表一个类,
???? 最基本的是Class类。
???? 1.我们在做任何操作的时候都是从Class开始的:
?????Class<?> cl = Class.forName("cn.com.Simpale");
???? 2.在上面的Class对象以后,我就可以开工干活了
???? Method[] method = cl.getDeclaredMethods();//获取这个类中的所有方法
??? ?Method method = cl.getMethod("message",new Class[] { String.class });//指定这个类中的message方法
???? ?Field[] filed = cl.getDeclaredFields();//获取这个类中的所有字段
????? Field filed = cl.getDeclaredField("a");//获取指定的特定的方法
????? 3.如果我们要调用这个方法,那么就用到:
????? Object ob = new Object[]{"1"};
????? method.invoke(cn.newInstance(), ob);//这个是带参数的方法调用,如果没有参数就ob为空了。
????? 4.获取实例:
?????? 我们在获取实例分为两种情况:一种就是没有参数的获取,这样的简单直接写为:cl.newInstance();
???? ?另一种为有参数的获取,这样就多几行代码,写为:
????? Constructor<?> cn = cl.getConstructor(new Class[] { String.class,String.class });//获取构造函数的方式
????? Object[] ob1 = new Object[] { " China", " bejing" };//构造函数的参数设置
????? cn.newInstance(ob1);//获取实例
????? 5.其实调用有参数的方法和有参数的实例是差不多的,只不过是多一个构造函数的构造。
????? 6.Class这个类好特殊啊,它也是继承了Object这个类,Java允许多种方法生成class object.
??????a.cl.getSuperclass();//获取父类的class object
????? b.class.forName("");//获取指定类的class object
????? c.String.class;//获取原生类型的class object
????? d.Boolean.TYPE;//获取primitive wrapper object?
????? 7.动态代理的原理:要有目标接口,代理类,执行类
????? 8.在jdk中必须实现java.lang.reflect.InvocationHandler接口中的
??????public Object invoke(Object proxy, Method method, Object[] args)throws Throwable;
????? 9.然后在执行类中:
????? java.lang.reflect.InvocationHandler hi = new Holdup(si);
????? Simpale ob = (Simpale)Proxy.newProxyInstance(si.getClass().getClassLoader(), si.getClass?? ().getInterfaces(), hi);
????? 这样基本完成了动态代理。从上面的学习过程我有很深的体会就是class-param-invoke,这样一贯通我的工作中就不会
遇到来之这方面的阻力了。代理也是一样,没什么的,只不过能更好的理解开源框架了。