【发布时间】:2012-05-16 16:22:17
【问题描述】:
我的问题是如何从给定的 .class 文件中获取 java.lang.Class 的实例? 那么如果我有文件 MyClass.class 和对应的 java.io.File 实例,如何使用它来获取对应于 MyClass 的 java.lang.Class 的实例?
【问题讨论】:
我的问题是如何从给定的 .class 文件中获取 java.lang.Class 的实例? 那么如果我有文件 MyClass.class 和对应的 java.io.File 实例,如何使用它来获取对应于 MyClass 的 java.lang.Class 的实例?
【问题讨论】:
Class<?> clazz = new URLClassLoader(new File("").toURL()).loadClass(className);
【讨论】:
new URLClassLoader(new URL[]{...})
您实际上需要一个类加载器来执行此操作(将字节码字节流转换为类)。这里有几个选项。一,您使用标准的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);
希望这能让你朝着正确的方向前进(!)
【讨论】: