java invoke(轉摘)


 

JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法;這種動態獲取的以及動態調用對象的方法的功能稱為java語言的反射機制。
Java反射機制主要提供了以下功能:在運行時判定任意一個對象所屬的類;在運行時構造任意一個類的對象;在運行時判定任意一個類所具有的成員變量和方法;在運行時調用任意一個對象的方法;生成動態代理。

package com.java.jvm; import java.lang.reflect.*; class InvokeTest { public static void main(String[] args) { try { Class c = Class.forName("com.java.jvm.User"); Object o = c.newInstance(); Method m = c.getMethod("getName", null); Object ret = m.invoke(o, null); System.out.println( "com.java.jvm.User.getName() = " + ret); m = c.getMethod("setName", new Class[]{String.class}); ret = m.invoke(o, new Object[]{"shengjian"}); System.out.println( "com.java.jvm.User.setName() = " + ret); m = c.getMethod("getName", null); ret = m.invoke(o, null); System.out.println( "com.java.jvm.User.getName() = " + ret); //靜態方法的調用 m = c.getMethod("getUserName", new Class[]{String.class}); ret = m.invoke(null, "fuwang"); System.out.println( "com.java.jvm.User.getUserName() = " + ret); } catch (ClassNotFoundException ex) { System.out.println("找不到此類別"); } catch (NoSuchMethodException ex) { System.out.println("此方法不存在"); } catch (IllegalAccessException ex) { System.out.println("沒有權限調用此方法"); } catch (InvocationTargetException ex) { System.out.println("調用此方法時發生下列例外:\n" + ex.getTargetException()); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } } }
c.getMethod("getName", null)返回一個 Method 對象,它反映此 Class 對象所表示的類或接口的指定公共成員方法。name 參數是一個 String,用於指定所需方法的簡稱。parameterTypes 參數是按聲明順序標識該方法形參類型的 Class 對象的一個數組。如果 parameterTypes 為 null,則按空數組處理。

name - 方法名 parameterTypes - 參數列表

Method 提供關於類或接口上單獨某個方法(以及如何訪問該方法)的信息。所反映的方法可能是類方法或實例方法(包括抽象方法)。

invoke()

對帶有指定參數的指定對象調用由此 Method 對象表示的底層方法。個別參數被自動解包,以便與基本形參相匹配,基本參數和引用參數都隨需服從方法調用轉換。

如果底層方法是靜態的,那么可以忽略指定的 obj 參數。該參數可以為 null。

如果底層方法所需的形參數為 0,則所提供的 args 數組長度可以為 0 或 null。

如果底層方法是實例方法,則使用動態方法查找來調用它,這一點記錄在 Java Language Specification, Second Edition 的第 15.12.4.4 節中;在發生基於目標對象的運行時類型的重寫時更應該這樣做。

如果底層方法是靜態的,並且尚未初始化聲明此方法的類,則會將其初始化。

如果方法正常完成,則將該方法返回的值返回給調用者;如果該值為基本類型,則首先適當地將其包裝在對象中。但是,如果該值的類型為一組基本類型,則數組元素不 被包裝在對象中;換句話說,將返回基本類型的數組。如果底層方法返回類型為 void,則該調用返回 null。

obj - 從中調用底層方法的對象args - 用於方法調用的參數。

User代碼:

package com.java.jvm; public class User { static{ System.out.println("static ---"); } public User(){ System.out.println("name="+name); name="xiaotian"; } private String name; private Integer age; private String address; public static String getUserName(String name){ return name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User [name=" + name + ", age=" + age + ", address=" + address + "]"; } }

 


免責聲明!

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



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