从 .class 文件中检索 Class<?> 类型

Leo*_*one 1 java reflection javafx

我有一个 javafx 窗口,当我将 .class 文件拖入其中时,我想将它们“转换”为 Class<?>

\n

我尝试使用 Class.forname ,问题是你必须知道包,这不是我的情况。 \n我尝试使用缓冲阅读器读取 .class 文件以检索内部包,但当然这是不可能的读取 .class 文件。

\n

因此,我需要找到一种方法将任何 .class 文件(无论其在计算机上的位置如何)转换为代码中的 Class<?> 。

\n
@Override\n    public void handle(DragEvent event) {\n        Dragboard db = event.getDragboard();\n        boolean success = false;\n        if (db.hasFiles()) {\n            for (File file : db.getFiles()) {\n                String fileName = file.getName();\n                // V\xc3\xa9rifiez si le fichier a l\'extension .class\n                if (fileName.endsWith(".class")) {\n\n                    //TODO\n                    \n                    //GlobalView.getInstance().addClassNode(new ClassNode(new Class(  the Class<?> object    )));\n\n                }\n            }\n        }\n        event.setDropCompleted(success);\n        event.consume();\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

Mic*_*ael 5

您的问题之一是您不知道该类的包,并且无法从文件路径合理地确定它。

您可以使用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
Run Code Online (Sandbox Code Playgroud)

从那里,您可以使用 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);
Run Code Online (Sandbox Code Playgroud)

如果类的依赖项不可加载,那么您需要重新考虑您的方法。加载没有依赖项的类是不可能的,并且由于用户只是拖放文件,因此该文件可能依赖于您无法合理找到的类。

很可能的情况是JavaClassBCEL 返回的实例已经包含您需要的所有信息,并且您实际上根本不需要加载该类。您对 Class 实例的用途还不够具体,所以我不能肯定地说。