Campo de obtención y descompilación de reflexión JavaSE

Uno, consigue Field

  • Hay dos formas de obtener variables miembro de Java:
    mediante métodos getter y setter; y
    mediante reflexión para obtener variables miembro

1. Métodos comunes

  • Referencia: métodos comunes de la clase Field
  • Class.getField (String name);
    devuelve un objeto Field , que refleja el campo miembro público especificado de la clase o interfaz representada por este objeto Class
  • Class.getFields ();
    devuelve una matriz que contiene algunos objetos Field , que contiene todos los campos públicos accesibles de la clase o interfaz representada por este objeto Class
  • Class.getDeclaredField (String name);
    devuelve un objeto Field que refleja el campo declarado especificado (incluidos los miembros privados) de la clase o interfaz representada por este objeto Class
  • Class.getDeclaredFields ();
    devuelve una matriz de objetos Field que contiene todos los campos (incluidos los miembros privados) declarados por la clase o interfaz representada por este objeto Class

2. Casos de prueba

  • Definir una clase de usuario
public class User {
    
    

	public int id;
	
	private String name;
	
	String address;
	
	protected int sno;
	
	public User() {
    
    }
	
	public User(int id, String name, String address, int sno) {
    
    
		super();
		this.id = id;
		this.name = name;
		this.address = address;
		this.sno = sno;
	}

	@Override
	public String toString() {
    
    
		return "User [id=" + id + ", name=" + name + ", address=" + address + ", sno=" + sno + "]";
	}

	@Override
	public int hashCode() {
    
    
		final int prime = 31;
		int result = 1;
		result = prime * result + ((address == null) ? 0 : address.hashCode());
		result = prime * result + id;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + sno;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
    
    
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		User other = (User) obj;
		if (address == null) {
    
    
			if (other.address != null)
				return false;
		} else if (!address.equals(other.address))
			return false;
		if (id != other.id)
			return false;
		if (name == null) {
    
    
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (sno != other.sno)
			return false;
		return true;
	}
}
  • Escribir clase de prueba
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class ReflectTest {
    
    
	public static void main(String[] args) throws ClassNotFoundException {
    
    
		// 获取整个类
        Class userClass = Class.forName("com.lzj.reflect.pojo.User");

        String className = userClass.getName();
        System.out.println("完整类名:" + className);

        String simpleName = userClass.getSimpleName();
        System.out.println("简易类名:" + simpleName);

        // 获取类中所有的public修饰的Field
        Field[] fields = userClass.getFields();
        System.out.println(fields.length); // 1
        
        // 取出这个Field
        Field f = fields[0];
        // 取出此Field的名字
        String fieldName = f.getName();
        System.out.println(fieldName); // id

        // 获取所有的Field
        Field[] fs = userClass.getDeclaredFields();
        System.out.println(fs.length); // 4
        System.out.println("---------------------");
        
        // 遍历
        for(Field field : fs){
    
    
            // 获取属性的修饰符列表
            int i = field.getModifiers(); // 返回的修饰符是一个数字,每个数字是修饰符的代号
            System.out.println(i);
            System.out.println("=====================");
            // 将代号数字转换成字符串
            String modifierString = Modifier.toString(i);
            System.out.println(modifierString);
            System.out.println("+++++++++++++++++++++");
            
            // 获取属性的类型
            Class fieldType = field.getType();
            // String fName = fieldType.getName();
            String fName = fieldType.getSimpleName();
            System.out.println(fName);
            System.out.println("*********************");
            
            // 获取属性的名字
            System.out.println(field.getName());
        }
	}
}

Dos, campo de descompilación

  • La descompilación consiste en invertir el archivo * .class para generar el archivo * .java
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class ReflectTest {
    
    
	public static void main(String[] args) throws Exception {
    
    
        StringBuilder str = new StringBuilder();

        Class userClass = Class.forName("com.lzj.reflect.pojo.User");

        str.append(Modifier.toString(userClass.getModifiers()) + " class " + userClass.getSimpleName() + " {\n");

        Field[] fields = userClass.getDeclaredFields();
        for(Field field : fields){
    
    
            str.append("\t");
            str.append(Modifier.toString(field.getModifiers()));
            str.append(" ");
            str.append(field.getType().getSimpleName());
            str.append(" ");
            str.append(field.getName());
            str.append(";\n");
        }

        str.append("}");
        System.out.println(str);
	}
}

1. Cómo prevenir la descompilación

  • Aislar programas Java
  • Cifre el archivo de clase
  • Ofuscación de código (convierta el código en una forma funcionalmente equivalente, pero difícil de leer y comprender)

Supongo que te gusta

Origin blog.csdn.net/LvJzzZ/article/details/108700196
Recomendado
Clasificación