我的目标是访问表示类的字节码的byte [],而无需在运行时明确知道类文件的位置。
我已经研究了两种解决方案并且能够从其中一种解决方案获得轻微的成功,但我想知道是否可能有其他方法来实现它(或者我在第二种解决方案中出错了我不能开始工作)。
我的第一个(温和)成功的解决方案是使用java.lang.instrumentation ClassFileTransformer类来访问类的byte []。尽管如此,我认为必须有一种更清洁的方法来实现这一目标。
我的第二个解决方案是使用-Xbootclasspath JVM参数将java.lang.ClassLoader替换为我自己的允许它访问加载的类的byte []。我添加了一个简单的System.out.println调试消息,以确认ClassLoader的覆盖是否正常,但事实并非如此。我从this paper得到了关于同一主题的这个想法。我的课程类似于在链接的论文中重新编写Integer类的方法。我还为JVM参数使用了类似的目录设置,如下所示:
java -Xbootclasspath/p:.\out\production\boot\java\lang TestLoader
我的想法是使用我链接的文件中的方法不能覆盖ClassLoader类。
我很想知道为什么我重写ClassLoader的尝试不起作用,并且还听说我还能做些什么才能访问类的byte []。
答案 0 :(得分:4)
你能用getResourceAsStream()来读取类字节吗?
InputStream is = String.class.getResourceAsStream("String.class");
修改添加备选方案:
(从评论中复制)
鉴于需要涵盖的所有可能性,ClassFileTransformer和instrumentation API可能是最佳选择。我不知道'clean'的要求是什么,但如果问题是必须为JVM指定命令行参数,你可以尝试使用Attach API - 你可以附加到已经运行的Java进程,推送在你的ClassFileTransformer中,查看已经加载到JVM中的所有类以及之后加载的所有类。
答案 1 :(得分:0)
我能找到的唯一解释是法语,但代码仍在java中。 :)
1-8页解释了如何构建类加载器并提供从类文件中获取字节的好主意。
此致 斯特凡
答案 2 :(得分:0)
我认为你刚刚启动了类路径错误。假设类加载器类文件是:
.\out\production\boot\java\lang\ClassLoader.class
你应该使用:
java -Xbootclasspath/p:.\out\production\boot TestLoader