java反射 field属性(三)


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 访问所有权限的。

你可能感兴趣的:(java反射)