package denglianbin.java.bean;
public class Student {
public int no;
private String name;
protected int age;
boolean sex;
}
1.反编译一个类的属性。
只要有一个类的名字,就可以反编译出这个类的属性信息。
package denglianbin.java.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class ReflectTest006 {
public static void main(String[] args) throws Exception{
StringBuilder s = new StringBuilder();
Class c =Class.forName("denglianbin.java.bean.Student");
s.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() + "{");
Field[] fields = c.getDeclaredFields();
for(Field field :fields){
s.append("\t");//缩进
s.append(Modifier.toString(field.getModifiers()));
s.append(" ");
s.append(field.getType().getSimpleName());
s.append(" ");
s.append(field.getName());
s.append(";\n");
}
s.append("}");
System.out.println(s);
}
}
2.访问一个java对象的属性,包括给属性赋值和获取值
package denglianbin.java.reflect;
import denglianbin.java.bean.Student;
import java.lang.reflect.Field;
public class ReflectTest007 {
public static void main(String[] args) throws Exception{
Class studentClass = Class.forName("denglianbin.java.bean.Student");
Object obj = studentClass.newInstance();
Field noField = studentClass.getDeclaredField("no");
noField.set(obj,2222);//给obj对象的no属性赋值2222
System.out.println(noField.get(obj));
Field nameField = studentClass.getDeclaredField("name");
nameField.setAccessible(true); // name属性是私有的,打破封装,设置完之后,外部也是可以访问private的属性
nameField.set(obj, "Tom");
System.out.println(nameField.get(obj));
}
}