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
.
我认为没有一种方法可以找到本地类(在方法中定义的类)。
您可以尝试枚举包中的所有类,然后使用 getEnclosingClass(与您要查找的相反)来过滤它们。
这是一种在方法中获取 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{
}
}
}
}
}
在 Java 中,没有通过设计枚举类的通用方法。这是因为类可以从任何地方加载,也可以动态创建。将类文件存储在 JAR 或目录中只是任何可能的类装入器之一。
因此,虽然假设封闭类是已知的可枚举集合可能更合理,但提供仅在该特殊情况下有效的方法是没有意义的。
如果假设 URLClassLoader
的常见情况,则可以将底层 URL 视为文件系统并枚举其内容。如果您正在创建一个工具来使用现有的第三方代码来执行某些操作,并且它甚至已被许多Java EE标准采用(我认为是错误的),这可能是合适的。
如果要创建插件机制,那么在已知位置提供元数据会更高效、更可靠,并且适用于任何有效的类装入器。
getDeclaredClasses()
方法返回(来自 javadoc)-
反映所有类和接口的类对象数组 声明为由 Class 对象表示的类的成员。 这包括公共、受保护、默认(包)访问和专用 类和接口由类声明,但不包括继承的 类和接口。
因此,它似乎不会返回您声明的任何内部类。这就是为什么你在Class
cls
数组中什么也得不到.