使用反射检索方法内的类

时间:2015-04-16 02:50:54

标签: java class oop reflection local-class

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 个答案:

答案 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

的数组中什么也得不到的