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 }\nRun Code Online (Sandbox Code Playgroud)\n
您的问题之一是您不知道该类的包,并且无法从文件路径合理地确定它。
您可以使用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 实例的用途还不够具体,所以我不能肯定地说。