反射之Field
反射之Field
获取属性信息
以下代码使用反射机制获取class文件中的属性信息:
package com.javalearn.reflect.field;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class TestForFiled {
public static void main(String[] args) throws Exception{
Class studentClass = Class.forName("com.javalearn.reflect.field.Student");
Field[] fields = studentClass.getFields(); // 获取所有public修饰的属性
System.out.println(fields.length);
Field field = fields[0];
String s = field.getName(); // 获取属性名
System.out.println(s);
Class fieldType = field.getType();
String typeName = fieldType.getName(); // 获取属性类型
System.out.println(typeName);
int i = field.getModifiers(); // 获取属性修饰符,修饰符可能有多个,整数表示修饰符组合的代号
System.out.println(i);
System.out.println(Modifier.toString(i)); // 把修饰符组合的代号转换为修饰符组合的名字
System.out.println();
Field[] fields1 = studentClass.getDeclaredFields();
System.out.println(fields1.length); // 获取所有属性
for (Field f: fields1) { // 遍历
System.out.println(f.getName());
}
}
}
class Student {
public static int no;
private String name;
}
输出结果:
1
no
int
9
public static
2
no
name
反编译
通过反射机制获取class属性,可以应用于反编译:
package com.javalearn.reflect.field;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class TestForCompile {
public static void main(String[] args) throws Exception{
StringBuilder s = new StringBuilder();
Class personClass = Class.forName("com.javalearn.reflect.field.Person"); // 字节码文件
s.append(Modifier.toString(personClass.getModifiers())+" class "+personClass.getSimpleName()); // 类修饰符,类名
s.append(" {\n");
Field[] fields = personClass.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);
}
}
输出结果:
public class Person {
private String name;
boolean sex;
}
操作对象的属性
以下代码利用反射机制操作对象的属性:
package com.javalearn.reflect.field;
import java.lang.reflect.Field;
public class TestForField2 {
public static void main(String[] args) throws Exception{
Class personClass = Class.forName("com.javalearn.reflect.field.Person"); // 字节码文件
Object obj = personClass.newInstance(); // 对象
Field noField = personClass.getDeclaredField("no"); // 属性,no为公有属性
noField.set(obj,23); // 赋值
System.out.println(noField.get(obj)); // 获取值
Field nameField = personClass.getDeclaredField("name"); // name为私有属性,访问需要打破封装
nameField.setAccessible(true); // 打破封装,属于反射机制的缺点,可能被不法分子利用
nameField.set(obj,"jack");
System.out.println(nameField.get(obj));
}
}
输出结果:
23
jack