2017-04-18 11 views
0
public class OuterClass { 
    private static class InnerClass { 
     public int id = 0; 
    } 
    private static InnerClass[] innerArr; 
} 

JavaのリフレクションでinnerArr値を取得する必要があります。Javaでリフレクションして内部クラスインスタンスを取得するにはどうすればよいですか?

ClassLoader loader = Thread.currentThread().getContextClassLoader(); 
Class<?> cla = loader.loadClass("OuterClass"); 
Field innerArrRef = cla.getDeclaredField("innerArr"); 
innerArrRef.setAccessible(true);  
OuterClass.InnerClass[] innerArrValue = (OuterClass.InnerClass[])innerArrRef.get(cla); 

上記のコードはInnerClassでは動作しません。プライベートクラスです。

+1

[mcve]として試したことを投稿し、問題のある箇所を説明してください。 –

+0

内部クラスが 'static'宣言されていないメンバークラスであるため、' private static class InnerClass'と宣言されたメンバ型に 'InnerClass'という名前を付けるのは悪い考えです。これにより、静的なネストされた型では、「Inner'-anything」という名前が非常に誤解を招くようになります。 (クラス名に 'Class'という冗長な単語を入れるのも悪い考えです。) –

答えて

1

のは、それをより面白くするためにあなたのOuterClassコードビットを調整してみましょう:配列にInnerClassのインスタンスに入れる:

private static InnerClass[] innerArr = { new InnerClass() }; 

今、あなたは、直接である別のクラスにプライベートタイプInnerClassを参照することはできません反射を使用して静的フィールドを取得しようとしています。まず、オブジェクトの配列として参照できます。

public static void main(String[] args) throws Exception { 
    Class<?> cla = OuterClass.class; 
    Field innerArrRef = cla.getDeclaredField("innerArr"); 
    innerArrRef.setAccessible(true); 
    Object[] innerArrValue = (Object[]) innerArrRef.get(cla); 

あなたはInnerClasタイプを使用するように反射してClassオブジェクトを使用する必要があります。

一つの方法は、OuterClass「クラスオブジェクトのdeclaredClassesプロパティを使用することです:

Class<?> inner = cla.getDeclaredClasses()[0]; 

をしかし、複数のメンバクラスがあります場合は、配列をループする必要があり、右のいずれかを検索します。もう一つの方法は、javacのは、あなたのInnerClassにmypackage.OuterClass$InnerClassのように見える完全修飾型名与えるという知識を使用することです:あなたはInnerClassのクラスオブジェクトを持っていたら

Class<?> inner = cla.getClassLoader().loadClass(cla.getName() + "$InnerClass"); 

を、あなたはそのフィールドにアクセスするためにリフレクションを使用することができますし、方法:

Field id = inner.getField("id"); 
    System.out.println("Inner id: " + id.getInt(innerArrValue[0])); 
} 
関連する問題