java 反射field 测试
tank类
package ReflectJava;
public class Tank {
private int x = 4;
public int y = 5;
public Tank(int x, int y) {
super();
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public Tank(){
}
public int add(){
return 4;
}
private void bdd(){
System.out.println("私有方法步能访问哦 亲!!");
}
private void cdd(int x,int y){
System.out.println(" 亲!!");
}
}
-----------------------tank父类-----------------------------------
package ReflectJava;
public class SuperTank {
private int z = 0;
public int x = 3;
public SuperTank() {
super();
// TODO Auto-generated constructor stub
}
public SuperTank(int z, int x) {
super();
this.z = z;
this.x = x;
}
///------------------测试类----------------------------------------
package ReflectJava;
import java.lang.reflect.Field;
public class Test1 {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchFieldException {
Class t = Tank.class;
Tank t1 = new Tank();
Field f = t.getDeclaredField("x"); //得到单一属性方法(公有,私有,保护的都可以)
System.out.println("getDeclaredField 得到的属性----"+f);
Field fk = t.getField("y"); //得到单一属性方法(只能为公有的)
System.out.println("getField得到的属性-----"+fk);
Field[] fs = t.getDeclaredFields();// 得到该类所有声明的属性(公有,保护,私有都可以)
System.out.println("------GET DeclareFields方法得到的属性值------");
for(Field ff: fs)
{
System.out.println(ff);
}
System.out.println("------GET fields()--方法得到的属性值------");
Field[] fss = t.getFields(); // 得到该类的所有属性包括其父类的属性(但只能是公有的)
for(Field ff1: fss)
{
System.out.println(ff1);
}
fk.set(t1, 6); // 调用field 的set方法可以往里面设值 而不需要new 该对象去set值了
System.out.println("通过fk.set(t1, 6)方法后,tank 属性由3变成 "+t1.getY());
}
}
------------------------------测试结果-------------------------------
[code="text/code]
getDeclaredField 得到的属性----protected int ReflectJava.Tank.x
getField得到的属性-----public int ReflectJava.Tank.y
------GET DeclareFields方法得到的属性值------
protected int ReflectJava.Tank.x
public int ReflectJava.Tank.y
------GET fields()--方法得到的属性值------
public int ReflectJava.Tank.y
public int ReflectJava.SuperTank.z
public int ReflectJava.SuperTank.x
通过fk.set(t1, 6)方法后,tank 属性由3变成 6
通过测试总结:
getFiled: 访问公有的属性
getDeclaredField:所有已声明的属性。但得不到其父类的属性
getFilds:访问所有的属性只能为公有的,注意当子类的属性和父类的属性相同时,如果都为 int x;则子类的Class对象.fields(x) 会访问子类的属性x,如果子类的属性是私有地,或者是保护类型的,则就会去访问父类的x属性了。
getDeclaredFieldgetDeclaredFields:得到该类所有已声明的属性
简单2句:field 只能访问公有的。
DeclaredField 访问所有权限的。