首页 > 基础教程 > 反射 > Reflection API
Java Class.getField()/getDeclaredField()返回成员变量
Class.getField()返回已加载类声明的所有public成员变量的Field对象,包括从父类继承过来的成员变量,参数name指定成员变量的名称。
Class.getDeclaredField()返回当前类所有成员变量。
定义
FieldgetField(String name)
FieldgetDeclaredField(String name)
源码
public Field getDeclaredField(String name) throws NoSuchFieldException,SecurityException
{
checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());
Field field = searchFields(privateGetDeclaredFields(false), name);
if (field == null) {
throw new NoSuchFieldException(name);
}
return field;
}
Private Field getField0(String name) throws NoSuchFieldException {
Field res = null;
// Search declared public fields
if ((res = searchFields(privateGetDeclaredFields(true), name)) != null) {
return res;
}
......
getField其实调用的是getField0,他们最后都调用了searchFields,不过getDeclaredField传入的是privateGetDeclaredFields(false), getField传入的是privateGetDeclaredFields(true)。
例子
package cn.com.vo;
public class Father {
public String name = "父亲";
public String sex = "男";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
} === ======================================
package cn.com.vo;
public class Son extends Father {
//public String name;
public int age = 20;
} === ======================================package cn.com.vo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import cn.com.vo.UserVo;
public class TestReflect {
/**
* java反射机制
*/
public static void main(String[] args) {
try {
//类的动态加载
Class c = Class.forName("cn.com.vo.Son"); //方式一
Son vo = (Son) c.newInstance();
Field f = c.getField("name");
System.out.println(f.get(vo));
//注意:下段代码会报错,
/*Field f2=c.getDeclaredField("name");
System.out.println(f2.get(vo));*/
} catch(ClassNotFoundException e) {
e.printStackTrace();
} catch(SecurityException e) {
e.printStackTrace();
} catch(NoSuchFieldException e) {
e.printStackTrace();
} catch(InstantiationException e) {
e.printStackTrace();
} catch(IllegalAccessException e) {
e.printStackTrace();
}
}
}
总结
1. getDeclaredField是可以获取一个类本身的所有字段. getField只能获取类及其父类的public 字段.
2. 如果想要获取父类的所有成员变量(主要是为了拿到私有成员变量,只想获取公有成员变量可以直接使用getField),可以通过取得当前类的父类的class对象再调用getDeclaredField方法。
版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。