Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用反射在方法内检索类_Java_Class_Oop_Reflection_Local Class - Fatal编程技术网

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{

                 }
             }
        }
   }
}