簡體   English   中英

實例化一個對象並使用JAVA中的反射通過.class文件調用方法?

[英]instantiate an object and invoking a method via a .class file using reflection in JAVA?

我有一個.class文件,對.class文件一無所知,包括類名,字段或方法。 我需要做的是找出關於類的所有內容並實例化該類的對象。

請記住,在調用getDeclareMethod(),getDeclareFields()和getDeclareConstructor()之后,我們對.class文件內部一無所知。我知道它包含String str的字段和帶有一個String參數的void方法,該參數嘗試分配名稱到沒有任何參數的變量str和純構造函數。

所以問題是如何實例化一個對象並調用該方法將一個String分配給str? 我知道當類或方法的聲明在同一個文件中時如何做,但這個是一個未知的.class文件,我求助於你們。

首先,您需要將.class文件轉換為Class對象。 您可以使用URLClassLoader執行此操作。

假設您有一個File classFile和一個String className

try {
    URLClassLoader classLoader = new URLClassLoader(new URL[]{classFile.toURI().toURL()});
    Class<?> clazz = classLoader.loadClass(className);
} catch (Exception e) {
    // something went wrong..
    e.printStackTrace();
}

現在您將類文件存儲在Class對象中,但是如何創建其類型的對象並從中調用方法? java.lang.reflect包的Java反射在這種情況下很有用。

假設您將Class<?>對象存儲在名為clazz的變量,方法名稱的String methodName和方法參數的String toSet中。

try {
    Object instance = clazz.newInstance();
    Method method = clazz.getDeclaredMethod(methodName, String.class);
    method.setAccessible(true);
    method.invoke(instance, toSet);
} catch (Exception e) {
    // something went wrong..
    e.printStackTrace();
}

請注意,如果方法名稱未知,則必須創建一種識別它的方法,這可以通過反射來完成,但通過使用字節碼注入/修改/分析庫檢查方法的字節碼可以更穩定地完成作為ASMBCEL 雖然BCEL自2006年以來一直沒有更新,但我個人認為,學習如何使用更容易; 但是,ASM速度更快,而且是最新的。

您可以將.cl​​ass文件轉換為java文件,即使用JAD對其進行反編譯,然后知道java文件的來源。

您可以使用資源,還可以在Google上找到更多資源。

只需使用本教程,您將獲得所有答案..

使用Java反射

反射是Java編程語言的一個特性。 它允許執行的Java程序檢查或“內省”自身,並操縱程序的內部屬性。 例如,Java類可以獲取其所有成員的名稱並顯示它們。

如果您有.class文件,則可以編寫自己的ClassLoader,並使用defineClass創建Class實例。 從那里,您可以獲得名稱和任何構造函數。 如果它有一個null構造函數,你只需在Class實例上執行newInstance,否則你需要搜索構造函數並將適當的參數傳遞給構造函數newInstance方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM