如何从.class文件中获取java.lang.Class的实例?

时间:2012-05-16 16:22:18

标签: java class java-io

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

2 个答案:

答案 0 :(得分:0)

Class<?> clazz = new URLClassLoader(new File("").toURL()).loadClass(className);

答案 1 :(得分:0)

您实际上需要一个类加载器来执行此操作(将字节码字节流转换为类)。这里有几个选择。一,您使用标准URLClassLoader实例,但这将依赖于您被放置在一个良好的Java包位置(您将创建URLClassLoader到您提交的文件路径的根目录。但这只有在目录结构镜像您要加载的类文件的包结构时才有效。

最简单的基类是SecureClassLoader,因为它允许您在启用了安全管理器的JVM中运行代码(哇,您可以设置代码库)

对你而言,重要的方法是findClass,因为它会将二进制名称转换为类(您可以在类名和正在加载的文件之间进行自己的映射)。您可以加载文件并将文件的字节传递给最重要的方法:defineClass。这是SecureClassLoader的一种方法。它需要您的类的二进制名称ByteBufferCodeSource(对于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);

希望这会让你走向正确的方向(!)