当前位置: 首页 > 面试题库 >

从加载的类中获取字节码

谈禄
2023-03-14
问题内容

假设我在JVM中有一个已加载的类Class<C> myClass。是否有 可靠的 方法向JVM请求 字节码 .class的内容?即是这样的:

<C> byte[] getClassBytecode(Class<C> myClass) {
    return /* the contents of the .class resource where C was loaded from */;
}

(显然,InputStream会和一样好byte[])。我知道我可以使用myClass.getResource()(和朋友们)来获取类文件,但是锤击类名称以获取要馈送给getResource的URL感觉是错误的。另外,我不确定在C动态生成(例如使用javax.tools.JavaCompiler)的情况下的行为。

有什么更好的主意吗?

注意:目标是能够推动 字节码 类到另一个JVM并使用自定义类加载器将它们加载到那里


问题答案:

注意:目标是能够在不同的JVM上使用自定义类加载器加载字节码

一个类加载器不只是加载字节码。因此,如果你

能够得到字节码出来的JVM内存(如果你写了很多的具体实现的本地代码理论上是可能的),这将是无用的远程类加载器。您需要给它一个实际的.class文件。

而Class.getResource()是完成此任务的最佳方法。由于它与调用类在同一个程序包中,因此您所要做的只是取该类的简单名称,然后附加“
.class”就可以了。

如果您具有内部或嵌套类,确实会变得有些困难,但这是无论如何都必须处理的实现细节(如果您推送初始类,则仍然需要提取任何依赖类)。



 类似资料:
  • 问题内容: 给定任意实例,包括运行时生成的实例(磁盘上没有文件),是否有任何方法获取类字节? 问题答案: 通常,这是不可能的。在加载类时,JVM会解析其字节码并将其转换为内部表示形式。此后,JVM可以随意忘记原始字节码,这就是HotSpot JVM真正发生的情况。 但是,对于某些黑客,可以检查内部类表示并将其转换回有效的类文件(尽管它将与原始字节码不同)。在HotSpot JVM中,该过程用于重新

  • 如何从JNI中JAR文件的字节数组加载所有类<我的代码 我需要读取JAR文件的字节,将它们转换成jbytes并从这些字节加载所有java类 比如java中的代码

  • 问题内容: 我正在使用一些第三方代码,这些代码在给定“ -classpath”命令行参数时不会设置java.class.path,而是仅创建一个类加载器,将命令行中指定的类路径中所有项的所有url添加到类加载器,然后将其设置为上下文类加载器。在我编写的此代码的插件类中,我获得了该类加载器的实例,并且需要以某种方式使用它来获取基础类路径,以便可以在JavaCompiler.getTask(… ),并

  • 问题内容: UnsafeMutableRawPointer(Swift 3中的新增功能)指向的一个字节如何从内存中访问字节(或Int16,float等),然后由C API(核心音频等)传递给Swift函数。 问题答案: 从内存中读取原始字节并构造一个type值: (可选)字节偏移量: 还有,从一个转换到一个,假设被指向的存储器包含类型T的值: 对于值数组,您可以创建“缓冲区指针”: 缓冲区指针可能

  • 问题内容: 我想知道如何将字节数组加载到 内存 URLClassLoader中?字节数组是jar文件的解密字节(如下所示)! 大多数内存类加载器都使用ClassLoader而不是URLClassLoader!我需要它使用URLClassLoader。 谢谢! 问题答案: 我将在这里发布我过去做过的实现: 我的自定义ClassLoader:

  • 这是我的代码 字符串构造函数不接收int,只接收字节数组.我看了文件上面说 read():从输入流中读取下一个字节的数据。