将包+class 名称翻译成.class 文件名
Translate package+class name to .class filename
我正在编写一个分析 .class
文件的程序。我想将包和 class 名称附加到我的输出中。
我的计划是编写一个函数,将包和 class 名称作为输入并找到相应的 .class
文件(因此用户不必也输入它,并且不能弄错),其中 'find' 应该被理解为“给我一些数据,我可以将其用作 BCEL 的 ClassParser
构造函数的参数”(文件名或 zip 文件的名称和zip 文件中的名称)。
我该怎么做? java 是否带有这样做的东西?我知道要在 CLASSPATH
的上下文中完成名称解析,因此用户也应该提供其中之一;没关系。
注意:解决方案应该不执行.class
文件中的任何代码。只是字节,女士 ;-)
如果您已经有了 class 文件,只需将 class 名称中的每个 / 替换为您系统的目录分隔符并附加 .class.
如果你想从 Java class 名称到字节码 class 名称,大多数 classes 都非常简单。在包前面加上'.'并替换“。”和 '/'。对于内部和嵌套的classes,我不确定是否有一个简单的算法。
好吧,如果您使用的是 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);
}
}
我要感谢 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
的值进行去硬编码。
我将使用我已经接受的答案,因为它对我来说工作更少,但我想提及这个答案,因为它更普遍适用(即依赖性更少)。
我正在编写一个分析 .class
文件的程序。我想将包和 class 名称附加到我的输出中。
我的计划是编写一个函数,将包和 class 名称作为输入并找到相应的 .class
文件(因此用户不必也输入它,并且不能弄错),其中 'find' 应该被理解为“给我一些数据,我可以将其用作 BCEL 的 ClassParser
构造函数的参数”(文件名或 zip 文件的名称和zip 文件中的名称)。
我该怎么做? java 是否带有这样做的东西?我知道要在 CLASSPATH
的上下文中完成名称解析,因此用户也应该提供其中之一;没关系。
注意:解决方案应该不执行.class
文件中的任何代码。只是字节,女士 ;-)
如果您已经有了 class 文件,只需将 class 名称中的每个 / 替换为您系统的目录分隔符并附加 .class.
如果你想从 Java class 名称到字节码 class 名称,大多数 classes 都非常简单。在包前面加上'.'并替换“。”和 '/'。对于内部和嵌套的classes,我不确定是否有一个简单的算法。
好吧,如果您使用的是 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);
}
}
我要感谢 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
的值进行去硬编码。
我将使用我已经接受的答案,因为它对我来说工作更少,但我想提及这个答案,因为它更普遍适用(即依赖性更少)。