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
@DavidConradgetDeclaredClasses()
返回所有声明的类,除了匿名类。你需要什么,你的用例?这可能是变相的吗?请注意,虽然指定了命名方案,但实际的数字不是。虽然不太可能,但如果数字是随机的或从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");
}