簡體   English   中英

使用反射檢索方法內的類

[英]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.

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