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