使用反射检索方法内的类


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数组中什么也得不到.

最新更新