如何将内存中的Java类转储到.class文件中?

如何将内存中的Java类转储到.class文件中?,java,.class-file,Java,.class File,我有一个模糊的javajar文件,当在JVM中运行时,它会自动解密。如果没有外部代理,我如何从JVM内存中获取一个简单的类,并创建一个.class文件 我已经尝试过使用java.lang.instrument代理的方法,如下所述: 它导致了例外 com.sun.tools.attach.AgentInitializationException: Agent JAR loaded but agent failed to initialize at sun.tools.attac

我有一个模糊的javajar文件,当在JVM中运行时,它会自动解密。如果没有外部代理,我如何从JVM内存中获取一个简单的类,并创建一个
.class
文件

我已经尝试过使用
java.lang.instrument
代理的方法,如下所述:

它导致了例外

com.sun.tools.attach.AgentInitializationException: 
    Agent JAR loaded but agent failed to initialize
    at sun.tools.attach.HotSpotVirtualMachine.loadAgent(HotSpotVirtualMachine.java:121)
我正在使用JDK8


我不知道
.class
文件是否只是
对象的序列化,我想不是(它是字节码)。

我不完全确定您的意思,当您尝试编译java类时,结果将是.class文件。例如,javac example.java将为您创建一个example.class文件否,我有一个带有模糊器的加密jar,我想从内存中转储类以研究您引用的代码正在使用java.lang.instrument中的
ClassFileTransformer
接口在加载类时获取类字节的副本。JDK8支持它。但是,在某些IDE环境中,它可能不受支持,因为IDE嫉妒它们自己的能力。好吧,但例外情况一点也不清楚,我如何调查这个问题?你有没有试过问谁得到了模糊化的jar,以获得一个未模糊化的版本?这个答案根本没有帮助。你没有回答这个问题。您要说的是如何从disk/jar/which获取类文件并复制它。对于内存中解密的类,或者通过某些Java代理(如PIT或JMockit)重新定义而修改的类,这一点都没有帮助。
try {
    InputStream fin = Foo.class.getClassLoader().getResourceAsStream("Foo.class");
    Files.copy(fin, Paths.get("./Foo.class"));
} catch (Exception e) {
    e.printStackTrace();
}