IT干货网

反射之Field

qq123 2022年03月12日 编程设计 158 0

反射之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 

评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

获取配置信息