有什么方法可以在运行时获取与ALL类关联的二进制数据,java字节码(我想将数据写入磁盘)。
我不想使用JMX。
基本上,我正在尝试检测类的问题,并且我希望将该类放在正在运行的字节码的磁盘上。
是否有从类加载器运行的所有类的列表?
如何获取该列表?
获取类列表后,我可以用什么代码提取字节码数据?
答案 0 :(得分:2)
我有一种感觉,你应该能够通过实现自己的类加载器来实现这一点,该类加载器记录加载的类并在加载时捕获它们的字节码文件。但事后这样做会更难。
除非您尝试对加密的应用程序(tsk,tsk)进行反向工程/破解,否则可能有更好的方法来“检测问题”。你为什么不告诉我们真的试图做什么?
如果您只想要加载的类列表,请启动设置了-verbose:class
选项的JVM。
答案 1 :(得分:1)
就像Stephen C所说的那样,-verbose选项可以列出跟踪加载的类的列表。 如果要提取类文件,也许可以使用java.lang.instrument来获取类文件。它只是用于检测java字节码。
基本方法如下:
仪表最大的作用,就是动态变化和操作的定义。开发人员可以通过-javaagent参数运行一个普通的Java程序(具有Java的主要功能)来指定特定的jar文件(包括Instrumentation Agents)来启动代理程序Instrumentation。 总结说是以下步骤:准备好的前置功能
准备Java类,其中包含以下两种方法 Public static void premain(String agentArgs,Instrumentation inst),[1] public static void premain(String agentArgs),[2]
package sample.verboseclass;
public class Main { public static void premain(String args,Instrumentation inst){ ... } }
其中,优先级[1] [2]级别高于优先级将执行([1]和[2]同时,法院被忽视[2])。 在此premain函数中,开发人员可以执行该类型的操作。 AgentArgs是进程参数的前置函数,伴随着“-javaagent”汇集在一起。和main函数不同,这个参数是一个字符串而不是一个字符串数组,如果参数有多个程序,那个程序就会被自解析字符串。 Inst是JVM自动导入的java.lang.instrument.Instrumentation示例。 Java.lang.instrument.Instrumentation仪器包是一个接口的定义,是这个包的核心部分,它集中了几乎所有的功能,例如,类型转换和操作的定义,等等。你必须实现这个接口
package sample.verboseclass;
public class Main {
public static void premain(String args, Instrumentation inst) {
inst.addTransformer(new Transformer());
}
}
class Transformer实现了ClassFileTransformer {
public byte[] transform(ClassLoader l, String className, Class<?> c,
ProtectionDomain pd, byte[] b) throws IllegalClassFormatException {
System.out.print("Loading class: ");
System.out.println(className);
return b;
}
}
Jar文件包装
此Java类将打包到一个jar文件中,并通过将“Premain-Class”添加到使用premain Java类准备的指定步骤来显示属性。 (可能还需要指定其他属性来打开更多功能)
清单 - 版本:1.0 Premain-Class:sample.verboseclass.Main
操作
使用Java程序通过以下Instrumentation运行: Java-javaagent:jar文档位置[=导入的premain参数]
在项目中,您可以编写代码以在ClassFileTransformer方法中提取字节代码,该方法将通过加载的byecode加载器传递给它。