Java编程方法获取与类关联的二进制数据

时间:2011-11-18 12:24:01

标签: java bytecode

有什么方法可以在运行时获取与ALL类关联的二进制数据,java字节码(我想将数据写入磁盘)。

我不想使用JMX。

基本上,我正在尝试检测类的问题,并且我希望将该类放在正在运行的字节码的磁盘上。

  1. 是否有从类加载器运行的所有类的列表?

  2. 如何获取该列表?

  3. 获取类列表后,我可以用什么代码提取字节码数据?

2 个答案:

答案 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加载器传递给它。