[英]Retrieving class inside a method using reflection
class test {
public static void main(String[] args) {
new test();
}
void method() {
class inside {
int a;
void methodinside() {}
}
}
}
我正在使用反射聲明類:
Class c = Class.forName("test");
Class[] cls = c.getDeclaredClasses();
for(Class cl : cls)
System.out.println(cl.getName());
但是,我的程序class inside
找不到class inside
。
我認為沒有一種方法可以找到本地類(在方法中定義的類)。
您可以嘗試枚舉包中的所有類 ,然后使用getEnclosingClass(與您要查找的相反)來過濾它們。
這是一種在方法中獲取Inner類的方法。
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> clazz = Class.forName("Outer$1InnerMethodClass");
System.out.println(clazz.getName());
clazz = Class.forName("Outer$2InnerMethodClass");
System.out.println(clazz.getName());
clazz = Class.forName("Outer$2InnerMethodClass$1InnerMethodInnetMethod");
System.out.println(clazz.getName());
}
}
class Outer{
void outerMethod1() {
class InnerMethodClass {
int a;
void innerMethod() {}
}
}
void outerMethod2() {
class InnerMethodClass {
int a;
void innerMethod() {
class InnerMethodInnetMethod{
}
}
}
}
}
在Java中,沒有通用設計枚舉類的通用方法。 這是因為類可以從任何地方加載,也可以動態創建。 將類文件存儲在JAR或目錄中只是任何可能的類加載器之一。
因此,雖然假設封閉類是已知的可枚舉集可能更合理,但提供僅在該特殊情況下有效的方法是沒有意義的。
如果您假設URLClassLoader
的常見情況,則可以將基礎URL視為文件系統並枚舉其內容。 如果您正在創建一個使用現有第三方代碼執行某些操作的工具,這可能是合適的,甚至已經被許多Java EE標准采用(我覺得錯誤)。
如果要創建插件機制,則在知名位置提供元數據會更高效,更可靠,並且可以與任何有效的類加載器一起使用。
getDeclaredClasses()
方法返回(來自javadoc ) -
一個Class對象數組,反映聲明為此Class對象所表示的類成員的所有類和接口。 這包括公共,受保護,默認(包)訪問以及類聲明的私有類和接口,但不包括繼承的類和接口。
所以它似乎沒有返回你聲明的任何內部類。 這就是為什么你在Class
cls
沒有得到任何東西的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.