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); } }