java 从.class文件检索Class〈?>类型

xam8gpfp  于 2023-01-04  发布在  Java
关注(0)|答案(1)|浏览(369)

我有一个javafx窗口,当我将.class文件拖入其中时,我想将它们“转换”为Class〈?〉
我试过使用Class.forname,问题是你必须知道包,这不是我的情况。我试过用缓冲读取器读取.class文件来检索里面的包,但当然不可能读取.class文件。
因此,我需要找到一种方法,将任何.class文件转换为代码中的Class〈?〉,而不管它在计算机上的位置。

@Override
    public void handle(DragEvent event) {
        Dragboard db = event.getDragboard();
        boolean success = false;
        if (db.hasFiles()) {
            for (File file : db.getFiles()) {
                String fileName = file.getName();
                // Vérifiez si le fichier a l'extension .class
                if (fileName.endsWith(".class")) {

                    //TODO
                    
                    //GlobalView.getInstance().addClassNode(new ClassNode(new Class(  the Class<?> object    )));

                }
            }
        }
        event.setDropCompleted(success);
        event.consume();
    }
5n0oy7gb

5n0oy7gb1#

您的问题之一是您不知道类的包,并且您不能从文件路径合理地确定它。
您可以使用Apache Commons BCEL来解析文件,以获取包以及关于它的大量其他信息。

String path = "/path/to/com/example/MyClass.class";
// org.apache.bcel.classfile.JavaClass and org.apache.bcel.classfile.ClassParser
JavaClass clazz = new ClassParser(path).parse();
String className = clazz.getClassName(); // com.example.MyClass

从那里,您可以使用URLClassLoader按名称实际加载类,前提是该类的所有依赖项都已加载或可加载:

String dir = Paths.get(path).getParent().toString() + '/';
URLClassLoader loader = new URLClassLoader(
    new URL[]{ new URL("file://" + dir) },
    getClass().getClassLoader()
);
Class<?> myClass = loader.loadClass(className);

如果类的依赖项是不可加载的,那么你需要重新考虑你的方法。加载一个没有依赖项的类是不可能的,而且当用户只是拖放一个文件时,这个文件可能依赖于你没有合理方法找到的类。
很有可能BCEL返回的JavaClass示例已经包含了您需要的所有信息,而您实际上根本不需要加载类。您没有足够具体地说明您使用Class示例的目的,所以我不能肯定。

相关问题