Java反射提供了一種有力的機制,可以在運行時檢查類及其成員(字段,方法,構造儀),而不是編譯時間。這是通過 java.lang.reflect
軟件包來實現的。這是如何使用它的細分:
首先,您需要獲得代表要檢查的類的類
對象。這可以通過幾種方式完成:
class.forname()
:此方法將完全合格的類名稱作為字符串。例如: class<?> myClass = class.Forname(; com.example.myclass");
請注意,請注意,使用 classNotFoundException
。 .class
::,如果您已經有了 。例如: myClass myObject = new myClass(); class<?> myClass = myObject.getClass();
int
,您可以使用 int.class
。 clast code 構造函數: constructor<?[] constructors = myClass.getConstructors();
這返回所有 public 構造儀的數組。 To get specific constructors (eg, by parameter types), use myClass.getConstructor(ParameterType1.class, ParameterType2.class, ...);
Method[] methods = myClass.getMethods();
This returns an array of all public methods.要獲取特定方法,請使用 myClass.getMethod('MethodName" parameType1.class,parametytype2.class2.Class,...);
用於訪問非公共方法,使用 myClass.getDeclaredMethods() myClass.getFields();
這將返回所有 public 字段的數組。與方法相似,使用 myClass.getDeclaredFields()
對於非公共字段。獲得 method> method> method> metch> metch>
field> field> field 對象,您可以使用 metchage.invoke(obsecs,args)和code(grags)和code>和code訪問該方法或修改字段/ <code> field.get(object)
/ field.set.set(object,value)
分別。請記住處理潛在的異常,例如 InvocationTargetException
, ilegalaccessexception
和 nosuchmethodexception
。
myClass.getDeclaredFields()
或 myClass.getDeclaredMethods()將使您訪問 all> All 成員,包括私有成員。但是,嘗試直接訪問或修改它們仍然會拋出 ilegalaccessexception
。要克服這一點,您必須在 setAccessible(true)
方法上使用 field
或方法
object: <pre class="brush:php;toolbar:false"> <pre class="brush:php;toolbar:false"> <code class="“" java> field private fivperfield = myclass.getDeclaredField(; myprivateField) privatefield.setaccessible(true);對象值= privateField.get(myObject); //訪問私有字段privatefield.set(myobject,newValue); //應該謹慎地修改使用</code>
使用 setAccessible(true)
。它繞過訪問修飾符,可能破壞封裝並導致代碼中的不可預見的後果。通常最好避免直接訪問私人會員,除非絕對必要。
使用Java反射會廣泛影響您的應用程序的性能。原因如下:
因此,裁定反射至關重要。對於應用程序的關鍵性能部分,始終首選直接方法調用和靜態訪問。僅當動態行為絕對必不可少並且性能成本是可以接受的。
Java Reflection允許使用 code> construct> constructor
對象進行動態對象實例化。如下:
<code class="“" java> string className =; com.example.myclass&quort&quort&quort&quort&quort&quot&quot&quot&quot&quot&quot&quot //或從配置文件,用戶輸入等。類&lt;?&gt; myClass = class.forname(className);構造函數&lt;?&gt; constructor = myClass.getConstructor(String.Class,int.class); //指定構造函數參數object myObject =構造函數。 //實例化對象</code>
此代碼段動態創建由 className
指定的類的實例。 getConstructor
方法根據參數類型找到適當的構造函數。然後, newinstance
方法使用該構造函數創建類的實例。請記住要處理潛在的異常,例如 classNotFoundException
, nosuchmethodexception
, instantiationException
和 InvocationTargetException
。這種方法使您可以基於運行時信息創建不同類的對象,而無需將代碼中的類名進行硬編碼。這在框架和插件架構中特別有用。
以上是如何使用Java反射在運行時檢查和操縱課程?的詳細內容。更多資訊請關注PHP中文網其他相關文章!