簡體   English   中英

Java:如何加載已經在類路徑上的類(及其內部類)?

[英]Java: How to load a class (and its inner classes) that is already on the class path?

如何加載已經在類路徑上的類,實例化它,並實例化其中定義的任何內部類?

例如:

public class TestClass {


    public class InnerClass { }

}

內部類不能存在於父類之外。 您需要首先構造父類。 沒有反思,這看起來像:

InnerClass innerClass = new TestClass().new InnerClass();

在反射中,您需要在構造內部類時傳遞父類。

Object testClass = Class.forName("com.example.TestClass").newInstance();
for (Class<?> cls : testClass.getClass().getDeclaredClasses()) {
    // You would like to exclude static nested classes 
    // since they require another approach.
    if (!Modifier.isStatic(cls.getModifiers())) {
        Object innerClass = cls
            .getDeclaredConstructor(new Class[] { testClass.getClass() })
            .newInstance(new Object[] { testClass });
    }
}

作為旁注,鑒於您的主要問題已得到解答 - 通常人們會像上面的示例中那樣聲明內部類,而不考慮它們是否可以是靜態內部類。

根據我的經驗,絕大多數(非匿名)內部類可以是靜態的,因為它們不需要訪問其父類的實例成員。 在這種情況下將內部類聲明為靜態更有效(因為運行時不需要為每個父實例定義新類),更少混淆(因為new TestClass().new InnerClass().getClass() != new TestClass().new InnerClass().getClass() )如果沒有適當的TestClass實例, new TestClass().new InnerClass().getClass() != new TestClass().new InnerClass().getClass()容易實例化。

所以,如果這適用於你,你可以 (並且可以說)應該如此聲明你的內部階級:

public class TestClass {

    public static class InnerClass { }

}

然后你可以簡單地將它實例化為new TestClass.InnerClass()

(如果你需要從InnerClass中訪問成員字段,那么當然要忽略所有這些!)

Class.forName("your classname").newInstance().

僅當構造函數實例化它們時,才會實例化內部類。

暫無
暫無

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

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