Java必須--高度なプロパティ反射

28661 ワード

反射メカニズムとは
プログラム実行状態では、任意のクラスまたはオブジェクトに対して、このクラスのすべての属性およびメソッド(プライベート属性およびメソッドを含む)を取得できます.この動的取得情報および動的呼び出しオブジェクトメソッドの機能を反射メカニズムと呼びます.簡単に言えば、反射により、クラスは私たちに完全に透明であり、何でも取得できます.
反射の利点
プログラムの実行中に、これらのオブジェクトを操作できます.デカップリングが可能で、プログラムの拡張性が向上
コードデモの説明
クラスを作成し、反射によってクラスを読み取り、操作します.
package com.yenroc.fanshe;

import java.math.BigDecimal;

public class Employee {
    
    public String id;
    
    String name;
    
    protected Integer age;
    
    private BigDecimal salary;

    public BigDecimal getSalary() {
        return salary;
    }
    
    public void setSalary(BigDecimal salary) {
        this.salary = salary;
    }
    
    public Employee(String id, String name, Integer age){
        this.id = id;
        this.name = name;
        this.age = age;
    }
    
    //         ,    public     ,    new Employee()
    public Employee(){
        
    }
    
    public void iSleep(){
        System.out.println("   。。");
    }
    
    private void iLook(){
        System.out.println("  。。");
    }

    @Override
    public String toString() {
        return "Employee [id=" + id + ", name=" + name + ", age=" + age + ", salary=" + salary + "]";
    }
    
}


反射コードの例
package com.yenroc.fanshe;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class FansheTest {
    
    public static void main(String[] args) throws Exception {
        getIClass();//   class
        
        getIClassInfo(Employee.class);//   Class   [  ,    ,  ]
        
        classField();// field       
        
        classConstructor();//        newInstance
        
        classMethod();//      invoke
    }
    
    /**
     * getClass:  Class       
     */
    private static void getIClass() throws Exception {
        // 1.      
        Class forNameClass = Class.forName("com.yenroc.fanshe.Employee");
        System.out.println("forNameClass=" + forNameClass);// forNameClass=class com.yenroc.fanshe.Employee
        //2.   
        Class className = Employee.class;
        System.out.println("className=" + className);//className=class com.yenroc.fanshe.Employee
        //3.    instance.getClass();
        Employee emp = new Employee();
        Class instanceClass = emp.getClass();
        System.out.println("instanceClass=" + instanceClass);// instanceClass=class com.yenroc.fanshe.Employee
        System.out.println(forNameClass == className);//true
        System.out.println(className == instanceClass);//true
    }
    
    /**
     *   Class   [  ,    ,  ]
     */
    private static void getIClassInfo(Class clazz) throws Exception {
        Field[] publicFields = clazz.getFields();//    public       
        Field[] allFields = clazz.getDeclaredFields();//         
        for (int i = 0; i < allFields.length; i++) {
            //allField=java.lang.String com.yenroc.fanshe.Employee.id
            //allField=public java.lang.String com.yenroc.fanshe.Employee.name
            //allField=protected java.lang.Integer com.yenroc.fanshe.Employee.age
            //allField=private java.math.BigDecimal com.yenroc.fanshe.Employee.salary
            System.out.println("allField="+allFields[i]);
        }
        
        Constructor<?>[] publicConstrutors = clazz.getConstructors();//    public       
        Constructor<?>[] allConstrutors = clazz.getDeclaredConstructors();//         
        for (int i = 0; i < allConstrutors.length; i++) {
            //allConstrutor=public com.yenroc.fanshe.Employee(java.lang.String,java.lang.String)
            //allConstrutor=public com.yenroc.fanshe.Employee()
            System.out.println("allConstrutor="+allConstrutors[i]);
        }
        
        Method[] publicMethods = clazz.getMethods();//     public     
        Method[] allMethods = clazz.getDeclaredMethods();//        
        for (int i = 0; i < allMethods.length; i++) {
            //allMethod=public java.lang.String com.yenroc.fanshe.Employee.toString()
            //allMethod=public void com.yenroc.fanshe.Employee.iSleep()
            //allMethod=public void com.yenroc.fanshe.Employee.setSalary(java.math.BigDecimal)
            //allMethod=private void com.yenroc.fanshe.Employee.iLook()
            //allMethod=public java.math.BigDecimal com.yenroc.fanshe.Employee.getSalary()
            System.out.println("allMethod="+allMethods[i]);
        }
    }
    
    /**
     * field       
     */
    private static void classField() throws Exception {
        Class clazz = Employee.class;
        Field idField = clazz.getField("id");//        public       
        /**
         * getDeclaredField     name,age,salary   ,      public  ,
         *      set get,                    
         * idField.setAccessible(true);              ,       
         */
        
        Employee emp = new Employee();
        String idValue = (String)idField.get(emp);//   emp   id    ,   new ,        null
        System.out.println("emp idValue="+ idValue);// emp idValue=null
        
        idField.set(emp,"aaaaaa");//  emp id    
        
        System.out.println(emp);// Employee [id=aaaaaa, name=null, age=null, salary=null]
    }
    
    /**
     *        newInstance
     */
    private static void classConstructor() throws Exception {
        Class clazz = Employee.class;
        Constructor constructor = clazz.getConstructor();//         
        Object empInstance = constructor.newInstance();
        System.out.println("empInstance = " + empInstance);// empInstance = Employee [id=null, name=null, age=null, salary=null]
        
        Constructor constructor2 = clazz.getConstructor(String.class,String.class,Integer.class);// id,name,age      
        Object empInstance2 = constructor2.newInstance("aaa", "yenroc", 25);
        System.out.println("empInstance2 = " + empInstance2);//empInstance2 = Employee [id=aaa, name=yenroc, age=25, salary=null]
    }
    
    /**
     *     
     */
    private static void classMethod() throws Exception {
        Class clazz = Employee.class;
        Method iSleepMethod = clazz.getMethod("iSleep");//iLook       
        Employee emp = new Employee();
        Object rtValue = iSleepMethod.invoke(emp);//iSleep()      ,    rtValue   null
        System.out.println("rtValue="+rtValue);//   。。\r rtValue=null
    }
    
}