前些日子在用Annotation的时候,发现了一个问题,就是使用下面的代码可以获取到当前类中的Fields,但是不能得到superclass中的fields。
Class类是Reflection API 中的核心类,它有以下方法
Class类是Reflection API 中的核心类,它有以下方法
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。
这里应该是当前类的所有属性
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
BaseBean的代码是:
运行的结果是:
你会发现父类中的field id、remark 并没有打印出来。
怎么样得到他们呢?
首先将main函数改为如下:
运行结果:
最主要的一段代码就是这里
巧妙的运用了for循环语句。如果还有其它的条件要加进来的话,就写在!cls.equals(Object.class);这段里,比如
java 代码
- package study;
- import java.lang.reflect.Field;
- public class MyBean extends BaseBean {
- /**
- * @param args
- */
- public static void main(String[] args) {
- try {
- Class cls=Class.forName(MyBean.class.getName());
- Field[] fields=cls.getDeclaredFields();
- System.out.println("==================");
- for(Field f:fields){
- System.out.println("field:"+f.getName());
- }
- System.out.println("==================");
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- private String porp1;
- private String prop2;
- private String prop3;
- public String getPorp1() {
- return porp1;
- }
- public void setPorp1(String porp1) {
- this.porp1 = porp1;
- }
- public String getProp2() {
- return prop2;
- }
- public void setProp2(String prop2) {
- this.prop2 = prop2;
- }
- public String getProp3() {
- return prop3;
- }
- public void setProp3(String prop3) {
- this.prop3 = prop3;
- }
- }
java 代码
- package study;
- public class BaseBean {
- private int id;
- private String remark;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getRemark() {
- return remark;
- }
- public void setRemark(String remark) {
- this.remark = remark;
- }
- }
运行的结果是:
java 代码
- ==================
- field:porp1
- field:prop2
- field:prop3
- ==================
怎么样得到他们呢?
首先将main函数改为如下:
java 代码
- public static void main(String[] args) {
try {
Class cls = Class.forName(MyBean.class.getName());
for (;!cls.equals(Object.class); cls = cls
.getSuperclass()) {
Field[] field = cls.getDeclaredFields();
for(Field f : field){
System.out.println(f.getName());
}
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
java 代码
- porp1
- prop2
- prop3
- id
- remark
java 代码
- for (;!cls.equals(Object.class); cls = cls
- .getSuperclass()) {
- Field[] field = cls.getDeclaredFields();
- .......................
- }
java 代码
- for (; field == null && !cls.equals(Object.class); cls = cls
- .getSuperclass()) {
- .......................
- }