我的问题是如何从给定的.class文件中获取java.lang.Class的实例? 因此,如果我有文件MyClass.class和相应的java.io.File实例,我如何使用它来获取与MyClass对应的java.lang.Class实例?
答案 0 :(得分:0)
Class<?> clazz = new URLClassLoader(new File("").toURL()).loadClass(className);
答案 1 :(得分:0)
您实际上需要一个类加载器来执行此操作(将字节码字节流转换为类)。这里有几个选择。一,您使用标准URLClassLoader
实例,但这将依赖于您被放置在一个良好的Java包位置(您将创建URLClassLoader
到您提交的文件路径的根目录。但这只有在目录结构镜像您要加载的类文件的包结构时才有效。
最简单的基类是SecureClassLoader
,因为它允许您在启用了安全管理器的JVM中运行代码(哇,您可以设置代码库)
对你而言,重要的方法是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);
希望这会让你走向正确的方向(!)