我的问题是如何从给定的 .class 文件中获取 java.lang.Class 的实例?因此,如果我有文件 MyClass.class 和相应的 java.io.File 实例,我如何使用它来获取与 MyClass 对应的 java.lang.Class 实例?
问问题
609 次
2 回答
0
Class<?> clazz = new URLClassLoader(new File("").toURL()).loadClass(className);
于 2012-05-16T16:26:57.933 回答
0
您实际上需要一个类加载器来执行此操作(将字节码字节流转换为类)。这里有几个选项。一,您使用标准URLClassLoader
实例,但这将依赖于您被放置在一个好的java包位置(您将创建URLClassLoader
文件所在文件路径的根目录。但这仅在目录结构镜像时才有效您尝试加载的类文件的包结构)。
最简单的基类是SecureClassLoader
允许您在启用了安全管理器的 JVM 中运行代码(iow,您可以设置代码库)
对您来说重要的方法是findClass
将二进制名称转换为类(您可以在类名和正在加载的文件之间进行自己的映射)。您可以加载文件并将文件的字节传递给最重要的方法:defineClass
. 这是一种方法SecureClassLoader
。它需要您的类的二进制名称,ByteBuffer
以及CodeSource
(用于 Java 安全性)
要从文件创建缓冲区,请使用:
FileInputStream fis = new FileInputStream(yourFileObj)
FileChannel channel = fis.getChannel();
ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, clsFile.length());
你需要一个 CodeSource
,这样你就可以在安全的环境中使用它,你可能想要使用类似的东西:
CodeSource cs = new CodeSource(clsFile.getParent().toURI().toURL(), (CodeSigner[]) null);
然后调用
Class<?> aClass = super.defineClass(name, buffer, cs);
希望这能让你走向正确的方向(!)
于 2012-05-16T17:08:44.307 回答