//反编译某个类的所有属性Field
public class User{
private String id ;
public int age;
protected String addr;
boolean sex;
}
// java.lang.reflect.Filed; 类中的属性
public class Test{
public static void main(String[] args) throws Exception{
//获取整个类
Class c = Class.forName("User");
//获取属性Filed
/*获取所有的public修饰的属性
Filed[] fs = c.getFields();
System.out.println(fs.length); //1
System.out.println(fs[0].getName());//返回Field对象表示的字段的名称
//输出:age
*/
//获取所有属性
Field[] fs1 = c.getDeclaredFields();
for(Filed field:fs1){
System.out.println(filed.getName())//id age addr sex
//返回Field对象所表示字段的声明类型 Class<?> getType();
Class type = field.getType();
System.out.println(type.getName());//返回Class对象所表示的类型的名称
//输出String int String boolean
//也可以用 System.out.println(type.getSimpleName());
//获取Field对象所表示字段的修饰符 (Modifier类)
//int getModifiers() 以整数形式返回由此Field对象表示的字段的修饰符
int i = field.getModifiers();
System.out.println(i); //2(private) 1(public) 4(protected) 0(缺省)
//将int转换为String static String toString(int mod)
System.out.println(Modifier.toString()); private public protected default
}
}
}
例子 动态输出User类
//例子动态输出User类
//Class 和Filed的getModifiers()方法类似
Class c = Class.forName("User");
Field fs[] = c.getDeclareFields();
StringBuffer sb = new StringBuffer();
sb.append(Modifier.toString(c.getModifiers())+" class "+c.getSimpleName()+"{");
for(Field field:fs){
sb.append(Modifier.toString(field.getModifiers())+" "); //修饰符
sb.append(field.getType().getSimpleName()+" "); //类型
sb.append(field.getName()+";\n");
}
sb.append("}")
System.out.println(sb);
获取某个类的特定属性
//获取某个指定的属性
//属性和属性之间靠变量名区分
//使用反射机制可以打破封装性
public class User{
private String id ;
public int age;
protected String addr;
boolean sex;
}
public class Test{
public static void main(String[] args) throws Exception{
Class c = Class.forName("User");
//Field getDeclaredField(String name) 返回指定属性的Field对象
Field idf = c.getDeclaredField("id");
//获取到某个特定属性可以用来? set get
Object o = c.newInstance();
//如果访问的属性是私有的,可以打破封装再访问
idf.setAccessible(true);
//void set(Object obj ,Object value)
idf.set(o,"100"); //将o对象的id值设置为100
//get
System.out.printlnidf.get(o); //100
}
}