java中 什么是反射?


JAVA反射機制是在運行狀態中,對於任意一個實體類,都能夠知道這個類的所有屬性和方法;

對於任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱為java語言的反射機制。

JAVA反射(放射)機制:“程序運行時,允許改變程序結構或變量類型,這種語言稱為動態語言”。從這個觀點看,Perl,Python,Ruby是動態語言,C++,Java,C#不是動態語言。但是JAVA有着一個非常突出的動態相關機制:Reflection,用在Java身上指的是我們可以於運行時加載、探知、使用編譯期間完全未知的classes。換句話說,Java程序可以加載一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),並生成其對象實體、或對其fields設值、或喚起其methods。

 

獲取String的方法

public class DumpMethods {


    public static void main(String[] args) throws Exception{
        
        Class<?> classType = Class.forName("java.lang.String");

        Method[] methods =classType.getDeclaredMethods();

        for (Method method:methods){
            System.out.println(method);
        }

    }


}

 

截圖:

 

 

 

 

 

通過反射調用方法 
  通過反射調用方法。詳情見代碼及注釋:
import java.lang.reflect.Method;
public class InvokeTester
{
    public int add(int param1, int param2)
    {
        return param1 + param2;
    }
    public String echo(String message)
    {
        return "Hello: " + message;
    }
    public static void main(String[] args) throws Exception
    {
        // 以前的常規執行手段
        InvokeTester tester = new InvokeTester();
        System.out.println(tester.add(1, 2));
        System.out.println(tester.echo("Tom"));
        System.out.println("---------------------------");

        // 通過反射的方式
        // 第一步,獲取Class對象
        // 前面用的方法是:Class.forName()方法獲取
        // 這里用第二種方法,類名.class
        Class<?> classType = InvokeTester.class;

        // 生成新的對象:用newInstance()方法
        Object invokeTester = classType.newInstance();
        System.out.println(invokeTester instanceof InvokeTester); // 輸出true



        // 通過反射調用方法
        // 首先需要獲得與該方法對應的Method對象
        Method addMethod = classType.getMethod("add", new Class[] { int.class,  int.class });

        // 第一個參數是方法名,第二個參數是這個方法所需要的參數的Class對象的數組
        // 調用目標方法
        Object result = addMethod.invoke(invokeTester, new Object[] { 1, 2 });
        System.out.println(result); // 此時result是Integer類型

        //調用第二個方法
        Method echoMethod = classType.getDeclaredMethod("echo", new Class[]{String.class});
        Object result2 = echoMethod.invoke(invokeTester, new Object[]{"Tom"});
        System.out.println(result2);
    }
}

 

 


免責聲明!

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



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