将包+类名翻译为.class文件名



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

我的计划是写一个函数,它以包和类名作为输入,并找到相应的.class文件(所以用户不必输入,也不能出错),其中"找到"应该被读为"给我一些数据,我可以用作BCEL的ClassParser构造器的参数"(无论是文件名,还是zip文件的名称和zip文件中的名称)。

我该怎么做呢?java有这样的功能吗?我理解名称解析是在CLASSPATH上下文中完成的,所以用户可能也应该提供其中一个;很好。

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

如果你使用的是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);
    }
}

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

如果您想从Java类名转换为字节码类名,大多数类都非常简单。在包前加上"+"。和替换。'与'/'。对于内部和嵌套类,我不确定是否有一个简单的算法。

我要感谢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("%sn", jc);
    return java_class;
}

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

我将使用我已经接受的答案,因为它对我来说需要较少的工作,但我想提到这个答案,因为它更普遍适用(即较少的依赖)。

相关内容

  • 没有找到相关文章

最新更新