Java Reflection

Java反射API

参见我的学习笔记

获取Class类的实例

4种方法:

  1. 对象-> Class instance
  2. 类名-> Class instance
  3. 类->Class instance
  4. TYPE语法
String str="abc";
Class c1=str.getClass();

Class c2=Class.forName("java.lang.String");

Class c3=java.lang.String.class;

Class c4=Boolean.TYPE;

由类名创建实例

Class c=Class.forName("A");
c.newInstance();//无参构造

Constructor[] cs=c.getDeclaredConstructors();//获取所有构造器,包括private、protected、public,这一点上与getConstructors()不同
Constructor c1=cs[0];
c1.newInstance(arg1,arg2,arg3);

Constructor constructor=c.getDeclaredConstructor(int.class);//根据参数列表获取指定构造器
constructor.newInstance(9);

获取与设置Field

值得注意的是,getDeclaredField可以获取所有Field,getField只能获得可见的部分Field。但是即使你通过getDeclaredField获得到了private的属性,你也无法直接对其进行set操作,因为即使反射也不可以超越可见性的。所以当对public的属性进行set可以直接赋值,对private的属性进行set就只能通过那个类提供的setter(该操作见下一节调用方法)。

Class c=null;
c=Class.forName("test.A");
A b= (A) c.newInstance();
c.getDeclaredField("a").set(b,3);//类.set(对象,参数);

Field[] fields=c.getDeclaredFields();

调用方法

获取方法

Method m=c.getMethod(method_name,int.class,boolean.class...);//public Method getMethod(String name, Class<?>... parameterTypes),第二个参数或者传入一个Class数组也可以

Class[] ptypes=new Class[5];
//再对数组中每个元素初始化,然后进行下一步
Method m=c.getMethod(method_name,ptypes);

//上面的是针对一般方法的,根据方法名和参数列表去获得方法
//下面是根据属性去获得该属性的getter和setter
Class c=null;
c=Class.forName("test.A");
PropertyDescriptor pd = new PropertyDescriptor("a", c);
// getMethod
Method getMethod = pd.getReadMethod();// 获得get方法
Method setter=pd.getWriteMethod();//获得setter

调用方法

m.invoke(specific_object, arg1,arg2,...);

动态强制类型转换

即你也不知道要转换成哪个类型,要等用户以字符串形式输入一个字符串才知道

Class T=Class.forName("model." + type);
T.cast(o);//o是一个对象

通过反射实例化泛型类

public static void main(String... args)  {
        Date date=createInstance(Date.class);
        String s=createInstance(String.class);
        System.out.println("date="+date+", string="+s);
    }

    public static <T> T createInstance(Class<T> cls) {
        T obj=null;
        try {
            obj=cls.newInstance();
        } catch (Exception e) {
            obj=null;
        }
        return obj;
    }
posted @ 2017-08-11 20:14  wind_dt  阅读(171)  评论(0编辑  收藏  举报