Java反射API
获取Class类的实例
4种方法:
- 对象-> Class instance
- 类名-> Class instance
- 类->Class instance
- 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和setterClass c=null;c=Class.forName("test.A");PropertyDescriptor pd = new PropertyDescriptor("a", c);// getMethodMethod 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 staticT createInstance(Class cls) { T obj=null; try { obj=cls.newInstance(); } catch (Exception e) { obj=null; } return obj; }