8
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.

4

4 回答 4

2

在 Java 中,没有设计枚举类的通用方法。这是因为类可以从任何地方加载,或者动态创建。将类文件存储在 JAR 或目录中只是任何可能的类加载器之一。

因此,虽然假设封闭类是已知的、可枚举的集合可能更合理,但提供仅在这种特殊情况下有效的方法是没有意义的。

如果您假设 a 的常见情况URLClassLoader,您可以将底层 URL 视为文件系统并枚举其内容。如果您正在创建一个工具来处理现有的第三方代码,这可能是合适的,并且它甚至已被许多 Java EE 标准采用(我觉得这是错误的)。

如果您正在创建插件机制,则在众所周知的位置提供元数据更有效、更可靠,并且可以与任何有效的类加载器一起使用。

于 2015-04-16T04:19:54.123 回答
2

我认为没有一种方法可以找到本地类(在方法中定义的类)。

您可以尝试枚举包中的所有类,然后使用 getEnclosureClass (与您要查找的相反)来过滤它们。

于 2015-04-16T03:12:18.103 回答
2

这是一种在方法中获取内部类的方法。

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{

                 }
             }
        }
   }
}
于 2015-04-16T04:02:39.657 回答
1

getDeclaredClasses()方法返回(来自javadoc)-

一个 Class 对象数组,反映了声明为该 Class 对象表示的类的成员的所有类和接口。这包括类声明的公共、受保护、默认(包)访问以及私有类和接口,但不包括继承的类和接口。

所以它似乎没有返回您声明的任何内部类。这就是为什么您在Class cls.

于 2015-04-16T03:05:05.497 回答