0

我的问题是如何从给定的 .class 文件中获取 java.lang.Class 的实例?因此,如果我有文件 MyClass.class 和相应的 java.io.File 实例,我如何使用它来获取与 MyClass 对应的 java.lang.Class 实例?

4

2 回答 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 回答