【问题标题】:How to get an instance of java.lang.Class from a .class file?如何从 .class 文件中获取 java.lang.Class 的实例?
【发布时间】:2012-05-16 16:22:17
【问题描述】:

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

【问题讨论】:

    标签: java class java-io


    【解决方案1】:

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

    【讨论】:

    • File.toURL 已被弃用,显然这个构造函数是未定义的。
    • 应该是new URLClassLoader(new URL[]{...})
    【解决方案2】:

    您实际上需要一个类加载器来执行此操作(将字节码字节流转换为类)。这里有几个选项。一,您使用标准的URLClassLoader 实例,但这将依赖于您被放置在一个好的java 包位置(您将创建URLClassLoader 到您文件所在的文件路径的根目录。但这只会当目录结构反映您尝试加载的类文件的包结构时工作)。

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

    对您来说重要的方法是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);
    

    希望这能让你朝着正确的方向前进(!)

    【讨论】:

    • 感谢您提供详细的回答:)。现在将通过它并尝试让它工作!
    猜你喜欢
    • 2014-02-11
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    相关资源
    最近更新 更多