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