反射之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
posted on 2021-12-12 12:25  菜小疯  阅读(223)  评论(0编辑  收藏  举报