如何获得封闭课程?

hol*_*ava 4 java java-8

我知道Class.getDeclaredClasses()可以获得它声明但不包括匿名类的所有类.

我想知道有没有办法通过封闭的类获得所有封闭的类?例如,我想获得Root为测试目的定义的所有封闭类.

class Root{
   void run(){
      Runnable task = new Runnable(){
         public void run(){}
      };

      task.getClass().getEnclosingClass();// return Root.class
      // but I want to get all enclosed class via Root.class, for example:
     // Root.class... == task.getClass() 
   }
}
Run Code Online (Sandbox Code Playgroud)

预期的结果是:[class of task].

Jor*_*nee 5

如果你知道你的匿名类的命名方案,你可以尝试加载它RootClassLoader:

javac的命名方案是<enclosing_class_name>$<anonymous_class_number>:

Class<?> enclosing = Root.class;

try{
    Class<?> anon1 = enclosing.getClassLoader().loadClass(enclosing.getName() + "$1");
    System.out.println(anon1); // prints: class Root$1
} catch (ClassNotFoundException e) {
    System.out.println("no anonymous classes");
}
Run Code Online (Sandbox Code Playgroud)

  • 使用类路径可能会更健壮.使用Guava,您可以使用[`ClassPath`](http://google.github.io/guava/releases/snapshot/api/docs/com/google/common/reflect/ClassPath.html)并执行类似`ClassPath的操作.from(Outer.class.getClassLoader()).getAllClasses().stream().filter(info - > info.getName().matches(Outer.class.getName()+"\\ $ [0-9] +")).图(ClassPath.ClassInfo ::负载).collect(toList())`. (4认同)
  • 请注意,虽然指定了命名方案,但实际的数字不是.https://docs.oracle.com/javase/specs/jls/se8/html/jls-13.html#jls-13.1虽然不太可能,但例如数字是随机的或从某个数字开始是合法的这样可行,但不一定有效. (3认同)