0

我正在编写一个分析.class文件的程序。我想将包和类名附加到我的输出中。

我的计划是编写一个函数,它将包和类名作为输入并找到相应的.class文件(这样用户也不必输入,也不会弄错),“find”应该是读作“给我一些我可以用作 BCELClassParser构造函数的参数的数据”(文件名,或 zip 文件的名称和 zip 文件中的名称)。

我该怎么做?java是否带有可以做到这一点的东西?我理解名称解析要在 a 的上下文中完成CLASSPATH,因此用户可能也应该提供其中一个;没关系。

注意:解决方案不应执行文件中的任何代码.class。只是字节,女士;-)

4

3 回答 3

1

好吧,如果您使用的是 BCEL,那么一切都已经存在,请参阅ClassPath

import java.io.IOException;
import org.apache.bcel.classfile.ClassParser;
import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.util.ClassPath;

public class BcelTest {
    public static void main(String[] args) throws IOException {
        String classPath=System.getProperty("java.class.path");
        // demonstrating with our own class path examplary for an arbitrary path String
        ClassPath cp=new ClassPath(classPath);
        ClassPath.ClassFile cf=cp.getClassFile(BcelTest.class.getName());
        ClassParser p=new ClassParser(cf.getInputStream(), cf.getPath());
        JavaClass jc = p.parse();
        System.out.println(jc);

        // or just using our own system path explicitly
        cf=ClassPath.SYSTEM_CLASS_PATH.getClassFile("java.lang.Object");
        p=new ClassParser(cf.getInputStream(), cf.getPath());
        jc = p.parse();
        System.out.println(jc);
    }
}
于 2016-06-28T15:44:05.450 回答
0

如果您已经拥有类文件,只需将类名中的每个 / 替换为系统的目录分隔符并附加 .class。

如果你想从 Java 类名到字节码类名,大多数类都非常简单。在包前面加上“。” 并替换“。” 和 '/'。对于内部类和嵌套类,我不确定是否有简单的算法。

于 2016-06-25T23:04:19.343 回答
0

我要感谢那些irc://freenode.org/##java指导我完成以下食谱的好人:

// replace 'Throwable' with something else in production code :-)
JavaClass recipe() throws Throwable {
    URLClassLoader loader = new URLClassLoader(new URL[] {
            new URL("file:///usr/share/java/js.jar"),
        });
    String path = "org/mozilla/classfile/ByteCode.class";
    InputStream resource = loader.getResourceAsStream(path);
    String fake_filename = "<" + path + ">";
    ClassParser classparser = new ClassParser(resource, fake_filename);
    JavaClass java_class = classparser.parse();
    // System.out.format("%s\n", jc);
    return java_class;
}

path可以通过基于用户输入以正确格式计算字符串来对类路径和值进行解硬编码。

我将使用我接受的答案,因为它需要我做的工作更少,但我想提一下这个答案,因为它更普遍适用(即依赖项更少)。

于 2016-06-30T22:41:52.817 回答