面的几节涉及反射的一些基本概念,下面介绍在以后开发是经常需要的用到的一些反射技术使用.
由于在前面没有特别指出来,如何反射一个类,并且得到一个类的实例,所以在这里,首先列出一个我们经常在网上面见到的方式:
public static void getReflectionFields(ReflectionTest r) {
Class temp = r.getClass();
String className = temp.getName();
/**获取public的成员变量*/
Field[] fields = temp.getFields();
/**获取所有成员变量*/
Field[] dfields = temp.getDeclaredFields();
// printFields(fields ,temp ,r);
printFields(dfields, temp ,r);
}
说明:ReflectionTest是自定义的一个类,然后通过 Class temp = r.getClass();获取类的一个对象.接下来就是去获取类里面的变量,方法.为什么需要特别列出这么一段呢?如果从实际的开发角度出发,既然是要使用反射,怎么可能有ReflectionTest这种”显示”的类提供呢?我们想到反射的时候,一般或者说更多是去反射别人的类,而不是自己工程里面的类,这个类可能作为系统的类,也可能只是放在某个文件夹下.所以这里我建议这样:
private static void FlexClass(String packagename){
try {
Class clazz=Class.forName(packagename);
try {
Object obj=clazz.newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这样做的好处是,我只需要传递一个packagename 给这个方法就好了,至于这个包名可以是自己工程里面的,也可以是系统里面的,也可以是放在某个文件夹中的.
注意到上面的区别以后,正式开始看一下,通过反射类,如何得到类里面的参数(Field),下面新建一个java工程,目录如下:
<1> : 首先新建一个被用于反射的类FlexClass.java:
/**
*
*/
package com.oneplus.flex;
/**
* @author zhibao.liu
* @Date 2015/11/18
* @company oneplus.Inc
*/
public class FlexClass {
private int Var1;
private String Var2;
private int Var3=12354;
private String Var4="hello , this is Var4 !";
private char Var5='B';
}
<2> : 由于这里面只涉及到Field的反射,所以类里面不再增加其他方法等.关于Field具体的API这里面不过去讲解(可以参考Field.java源代码),下面给出下面例子当中用到的:
|
|