通过java的反射机制,可以轻松获得类变量的所有信息,并且可以修改变量的值,如果这些属性是private活protected的,则必须设置setAccessible(true)的方法,否则会抛出IllegalAccessException异常,如果java安全机制,则可能会抛出securityException异常
import java.lang.reflect.Field;
public class fieldTest {
public static void main(String[] args) throws IllegalAccessException{
House house=new House("gdgdg",160,300,"peking wangfujing","wang");
Class c=house.getClass();
Field[] fields=c.getDeclaredFields();
System.out.println("共有成员变量:"+fields.length);
System.out.println("-----------------------------");
for(Field field:fields){
field.setAccessible(true);
Class t=field.getType();
if (t==String.class){
System.out.println(field.getName()+":"+field.get(house));
}
if(t ==int.class){
System.out.println(field.getName()+":"+field.getInt(house));
}
}
System.out.println("\n 变量设置新值");
System.out.println("----------------------");
for(Field field:fields){
field.setAccessible(true);
String n=field.getName();
if (n.equalsIgnoreCase("owner")){
field.set(house,"wang liang");
}
if (n.equalsIgnoreCase("space")){
field.set(house,field.getInt(house)*2);
}
if (n.equalsIgnoreCase("price")){
field.set(house,field.getInt(house)*2);
}
if (n.equalsIgnoreCase("address")){
field.set(house,"fujian yongding");
}
if (n.equalsIgnoreCase("name")){
field.set(house,"wanglu house");
}
}
for(Field field:fields){
System.out.println(field.getName()+":"+field.get(house));
}
}
}
class House{
public String owner;
protected int space;
private int price;
private String address;
private static String name;
public House(){}
public House(String owner,int space,int price,String address,String n){
this.owner=owner;
this.space=space;
this.price=price;
this.address=address;
name=n;
}
}
结果:
house的实例获得了class对象,通过class对象获取的house的所有属性,并将变量的名字和字值打印出来,然后通过设置setAccessible(true)方法,修改house的公共变量和私有变量。