JAVA的反射理解


1----------------------------反射的概念-----------------------------------------------

JAVA的反射機制是在運行狀態中,對於一個類可以知道它的屬性和方法,對於一個對象我們可以調用這個對象的屬性和方法,對於這種可以動態的知道類的信息和動態調用的功能稱之為JAVA的反射。

2----------------------------作用-----------------------------------------------------

在運行時調用任意一個對象的方法;

生成動態代理。

3---------------------------基本代碼--------------------------------------------------

(1)涉及到的jdk類

java.lang.Class;                

java.lang.reflect.Constructor; java.lang.reflect.Field;        

java.lang.reflect.Method;

java.lang.reflect.Modifier;

(2)反射實例化

Class c =Class.forName("Employee");
//創建此Class 對象所表示的類的一個新實例  
Objecto = c.newInstance(); //調用了Employee的無參數構造方法.

(3)獲取類中的屬性

//獲取整個類  
            Class c = Class.forName("java.lang.Integer");  
              //獲取所有的屬性?  
            Field[] fs = c.getDeclaredFields();  
       
                   //定義可變長的字符串,用來存儲屬性  
            StringBuffer sb = new StringBuffer();  
            //通過追加的方法,將每個屬性拼接到此字符串中  
            //最外邊的public定義  
            sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");  
            //里邊的每一個屬性  
            for(Field field:fs){  
                sb.append("\t");//空格  
                sb.append(Modifier.toString(field.getModifiers())+" ");//獲得屬性的修飾符,例如public,static等等  
                sb.append(field.getType().getSimpleName() + " ");//屬性的類型的名字  
                sb.append(field.getName()+";\n");//屬性的名字+回車  
            }  
      
            sb.append("}");  
      
            System.out.println(sb); 

(3)獲取特定的屬性
    public static void main(String[] args) throws Exception{  
                  
    <span style="white-space:pre">  </span>//以前的方式:  
        /*
        User u = new User();
        u.age = 12; //set
        System.out.println(u.age); //get
        */  
                  
        //獲取類  
        Class c = Class.forName("User");  
        //獲取id屬性  
        Field idF = c.getDeclaredField("id");  
        //實例化這個類賦給o  
        Object o = c.newInstance();  
        //打破封裝  
        idF.setAccessible(true); //使用反射機制可以打破封裝性,導致了java對象的屬性不安全。  
        //給o對象的id屬性賦值"110"  
        idF.set(o, "110"); //set  
        //get  
        System.out.println(idF.get(o));  
    } 

(4)調用某個類的方法

import java.lang.reflect.Method;
public class TestReflect {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = Class.forName("net.xsoftlab.baike.TestReflect");
        // 調用TestReflect類中的reflect1方法
        Method method = clazz.getMethod("reflect1");
        method.invoke(clazz.newInstance());
        // Java 反射機制 - 調用某個類的方法1.
        // 調用TestReflect的reflect2方法
        method = clazz.getMethod("reflect2", int.class, String.class);
        method.invoke(clazz.newInstance(), 20, "張三");
        // Java 反射機制 - 調用某個類的方法2.
        // age -> 20. name -> 張三
    }
    public void reflect1() {
        System.out.println("Java 反射機制 - 調用某個類的方法1.");
    }
    public void reflect2(int age, String name) {
        System.out.println("Java 反射機制 - 調用某個類的方法2.");
        System.out.println("age -> " + age + ". name -> " + name);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM