Java 如何获得封闭式课堂?

Java 如何获得封闭式课堂?,java,java-8,Java,Java 8,我知道Class.getDeclaredClasses()可以获取它声明的所有类,但不包括匿名类 我想知道有没有办法通过封闭类获得所有封闭类?例如,我想获取Root中定义的所有封闭类,以便进行测试 class Root{ void run(){ Runnable task = new Runnable(){ public void run(){} }; task.getClass().getEnclosingClass();// re

我知道
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() 
   }
}

预期结果是:
[任务类]

如果您知道匿名类的命名方案,可以尝试使用
类加载器
加载它:

javac的命名方案是
$

Class封闭=Root.Class;
试一试{
类anon1=封闭的.getClassLoader().loadClass(封闭的.getName()+“$1”);
System.out.println(anon1);//prints:class Root$1
}catch(classnotfounde异常){
System.out.println(“无匿名类”);
}

task
是局部变量的名称,我认为没有任何方法可以得到它。或者您到底想要实现什么?@luk2302但是
任务
是在
根中定义的,编译器将为匿名类生成一个额外的类。
getDeclaredClasses()
会这样做吗?我没用过。啊,不,显然这就是你要问的,但是你没有使用
es
@DavidConrad
getDeclaredClasses()
返回所有声明的类,除了匿名类。你需要什么,你的用例?这可能是变相的吗?请注意,虽然指定了命名方案,但实际的数字不是。虽然不太可能,但如果数字是随机的或从1以外的某个数字开始,则是合法的。这是可行的,但不一定要行。谢谢你,先生。我立即尝试并尽快结束问题。使用
findLoadedClass
可能比使用类路径更可靠。使用番石榴,您可以使用并执行类似于
ClassPath.from(Outer.class.getClassLoader()).getAllClasses().stream().filter(info->info.getName().matches(Outer.class.getName()+“\\\$[0-9]+”).map(ClassPath.ClassInfo::load).collect(toList())
@Radiodef关于可能发生的重命名的最佳观点。一个例子是脱糖羔羊。目前它是
lambda$go$0
其中
go
是声明特定lambda的方法;而它过去是
lambda$0
。。。
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");
}