Java 使用反射在方法内检索类
我使用反射声明类,如:Java 使用反射在方法内检索类,java,class,oop,reflection,local-class,Java,Class,Oop,Reflection,Local Class,我使用反射声明类,如: class test { public static void main(String[] args) { new test(); } void method() { class inside { int a; void methodinside() {} } } } 但是,我的程序在中找不到类getDeclaredClasses
class test {
public static void main(String[] args) {
new test();
}
void method() {
class inside {
int a;
void methodinside() {}
}
}
}
但是,我的程序在
中找不到类getDeclaredClasses()
方法返回(从)——
反映所有类和接口的类对象数组
声明为该类对象表示的类的成员。
这包括公共、受保护、默认(包)访问和私有访问
类声明的类和接口,但不包括继承的
类和接口
所以它似乎不返回您声明的任何内部类。这就是为什么在Class
cls
数组中找不到任何本地类(在方法中定义的类)的原因
然后可以使用GetEnclosuringClass(与您要查找的相反)来过滤它们。这是一种在方法中获取内部类的方法
Class c = Class.forName("test");
Class[] cls = c.getDeclaredClasses();
for(Class cl : cls)
System.out.println(cl.getName());
公共类主{
公共静态void main(字符串[]args)引发ClassNotFoundException{
Class clazz=Class.forName(“外部$1InnerMethodClass”);
System.out.println(clazz.getName());
clazz=Class.forName(“外部$2InnerMethodClass”);
System.out.println(clazz.getName());
clazz=Class.forName(“外部$2InnerMethodClass$1innermethod”);
System.out.println(clazz.getName());
}
}
类外部{
void outerMethod1(){
类InnerMethodClass{
INTA;
void innerMethod(){}
}
}
void outerMethod2(){
类InnerMethodClass{
INTA;
void innerMethod(){
类InnerMethodInnetMethod{
}
}
}
}
}
在Java中,没有按设计枚举类的通用方法。这是因为类可以从任何地方加载,也可以动态创建。在JAR或目录中存储类文件只是任何可能的类装入器之一
因此,虽然假设封闭类是一个已知的可枚举集可能更合理,但提供一个只在这种特殊情况下工作的方法是没有意义的
如果您假设一个URLClassLoader
的常见情况,则可以将底层URL视为文件系统并枚举其内容。如果您正在创建一个工具来处理现有的第三方代码,并且它甚至已经被许多JavaEE标准采用(我觉得这是错误的),那么这可能是合适的
如果您正在创建一个插件机制,它将更加高效、可靠,并且可以与任何有效的类加载器一起工作。很有趣,因为我们可以使用getenclosuringclass
进行相反的操作。如何在main中访问,而类在另一个方法或另一个类中访问???如果要从main
访问该类,则必须在main
可以看到它的地方声明它。这些局部类的要点是从声明方法外部看不到。除了反射之外,还有什么想法或其他方式吗?这可能是一个X-Y问题。你到底想干什么?您是否正在开发某种IDE工具?我也不相信有方法可以枚举包中的所有类。请在类文件上查看。创建了文件test$1inside.class,但无法安全地将其推广。本地类的确切名称不受规范的约束,只受其格式的约束。
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{
}
}
}
}
}