2007-09-11

Java反射机制

Java反射机制
一.概述
   reflection是一系列的API,用于表示或者处理当前JVM中的类,接口和对象.
   java.lang.reflect/java.lang.Class
二.主要功能
    确定一个对象的类
    取出类的modifiers,数据成员,方法,构造器,和超类.
    找出某个接口里定义的常量和方法说明.
    创建一个类实例,这个实例在运行时刻才有名字(运行时间才生成的对象).
    取得和设定对象数据成员的值,如果数据成员名是运行时刻确定的也能做到.
    在运行时刻调用动态对象的方法.
    创建数组,数组大小和类型在运行时刻才确定,也能更改数组成员的值.
三.分析类
   取得数据成员名,方法和构造器
四.取得Class对象
   方法一>
          如:myobject是某个类的对象
          则他的Class对象是Class myobjectclass=myobject.getClass()
                           System.err.println(myobjectclass.toString())
   方法二>取得某类对象的超类,可以用getSuperClass()方法
          如:TextComponet 类是TextField的超类
          TextField t=new TextField();
          Class c=t.getClass();
          Class s=c.getSuperclass();
    方法三>如果已知一个class
          如:已知java.swt.(Button.class)
          Class c=java.swt.Button.class;//直接获得Class对象.
          System.err.println(c.toString());
    方法三>运行时才确定的类.(运行时绑定)
          forName(类名)返回一个Class对象.
          如:Class c=Class.forName("java.swt.Button")
   
五.取得类名
六.找出超类
   getSuperclass();
                c x=new c();
  Class xx=x.getClass();
  Class xxx=xx.getSuperclass();
  System.err.println(xx.toString());//class
  System.err.println("XX的超类是:"+xxx.toString());
七.确定某类实现的接口
   getIntface()方法,返回一个Class对象数组.
   MyObject o=new MyObject();
   Class c=o.getClass();
   Class[] theinterfaces=c.getIntfaces();
   for(int i=0;i
   {
      String interfacename=theinterfaces[i].getName();
      System.out.println(interfacename);
   }
八.检查接口
   同上....^_^
九.取得类字段(属性)
   getFields()返回一个字段数组.
   //::
   Panel g=new Panel();
   Class c=g.getClass();
   Field[] publicFields=c.getFields();
   for(int i=0;i
   {
      String fieldName=poublicFields[i].getName();
      Class typeclass=publicFields[i].getType();
      string fieldType=typeclass.getName();
      System.out.println("字段:"+fieldName+"字段类型:"+fieldType);
   }
十.取得构造方法
   getconstructors()返回一个constructor对象数组.利用这个constructor对象可以获得构造方法的名字,参数(getParameterTypes()获得
   参数类型列表),
   修饰符抛出的异常列表等信息.也可以用constructor.newInstance()创建一个新的constructor对象.
   如:> myobject o=new myobject();
        Class c=o.getClass();
        Constructor[] theConstructors=c.getConstructors();
        for(int i=0;i
        {
            Class[] parameterTypes=theConstructors[i].getParameterTypes();
            for(int k=0;k
            {
                 String parameterString=parameterTypes[k].getName();
                 System.out.print(parameterString+"  ")
            }
            System.out.println();

        }
评论
hellsing42 2007-09-18   回复
另外还有要注意declared的区别,比如getDeclaredMethods
还有就是获得generic的信息,只有class头上的和field上的可以获得
e.g.
((ParameterizedType) obj.getClass().getGenericSuperclass()).getActualTypeArguments();

((ParameterizedType)field.getGenericType()).getActualTypeArguments()[0];
还有就是annotation的信息获取

还有就是java.lang.reflect.Modifier的使用
Modifier.isFinal(obj.getClass().getModifiers())
等等

楼主说的很好,补充几个反射的应用 :
spring 的 ioc/di 也是反射....
javaBean和jsp之间调用也是反射....
struts的 FormBean 和页面之间...也是通过反射调用....
JDBC 的 classForName()也是反射.....
hibernate的 find(Class clazz) 也是反射....
发表评论

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

hellsing42
搜索本博客
我的相册
B2760551-d25c-3e24-ba6d-b3d87475fdc4-thumb
o_umlList
共 1 张
最近加入圈子
存档
最新评论