2008-04-24

自己学习java reflect体会

关键字: 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,这样一贯通我的工作中就不会
遇到来之这方面的阻力了。代理也是一样,没什么的,只不过能更好的理解开源框架了。

评论
发表评论

您还没有登录,请登录后发表评论

gaoran2008
搜索本博客
最近加入圈子
最新评论