8
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

4

4 に答える 4

2

これは、メソッドで 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{

                 }
             }
        }
   }
}
于 2015-04-16T04:02:39.657 に答える
2

ローカルクラス(メソッド内で定義されたクラス)を見つける方法はないと思います。

パッケージ内のすべてのクラスを列挙してから、 getEnclosingClass (探しているものとは逆) を使用してそれらをフィルタリングすることができます。

于 2015-04-16T03:12:18.103 に答える
1

このgetDeclaredClasses()メソッドは ( javadocから)-

この Class オブジェクトによって表されるクラスのメンバーとして宣言されたすべてのクラスおよびインターフェースを反映する Class オブジェクトの配列。これには、パブリック、保護、デフォルト (パッケージ) アクセス、およびクラスによって宣言されたプライベート クラスとインターフェイスが含まれますが、継承されたクラスとインターフェイスは除外されます。

したがって、宣言した内部クラスは返されないようです。そのため、 の配列には何も取得されませんClass cls

于 2015-04-16T03:05:05.497 に答える