我正在寻找一种方法来获取jar文件中所有类的方法存根的列表。我不确定从哪里开始…我可以使用Reflection或Javassist或其他我还没有听说过的工具吗?至少有可能打开jar包,反编译类文件并使用行解析器扫描方法,但是我认为这是最肮脏的方法;-)
有任何想法吗?
亲切的问候
根据aioobe的回答,您还可以使用ASM的树API(而不是其访问者API)来解析JAR文件中包含的类文件的内容。同样,您可以使用JarFile类读取JAR文件中包含的文件。这是如何完成此操作的示例:
该printMethodStubs
方法接受a JarFile
并继续打印出所有类文件中包含的所有方法的描述。
public void printMethodStubs(JarFile jarFile) throws Exception {
Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
String entryName = entry.getName();
if (entryName.endsWith(".class")) {
ClassNode classNode = new ClassNode();
InputStream classFileInputStream = jarFile.getInputStream(entry);
try {
ClassReader classReader = new ClassReader(classFileInputStream);
classReader.accept(classNode, 0);
} finally {
classFileInputStream.close();
}
System.out.println(describeClass(classNode));
}
}
}
该describeClass
方法接受一个ClassNode
对象并继续对其进行描述及其相关方法:
public String describeClass(ClassNode classNode) {
StringBuilder classDescription = new StringBuilder();
Type classType = Type.getObjectType(classNode.name);
// The class signature (e.g. - "public class Foo")
if ((classNode.access & Opcodes.ACC_PUBLIC) != 0) {
classDescription.append("public ");
}
if ((classNode.access & Opcodes.ACC_PRIVATE) != 0) {
classDescription.append("private ");
}
if ((classNode.access & Opcodes.ACC_PROTECTED) != 0) {
classDescription.append("protected ");
}
if ((classNode.access & Opcodes.ACC_ABSTRACT) != 0) {
classDescription.append("abstract ");
}
if ((classNode.access & Opcodes.ACC_INTERFACE) != 0) {
classDescription.append("interface ");
} else {
classDescription.append("class ");
}
classDescription.append(classType.getClassName()).append("\n");
classDescription.append("{\n");
// The method signatures (e.g. - "public static void main(String[]) throws Exception")
@SuppressWarnings("unchecked")
List<MethodNode> methodNodes = classNode.methods;
for (MethodNode methodNode : methodNodes) {
String methodDescription = describeMethod(methodNode);
classDescription.append("\t").append(methodDescription).append("\n");
}
classDescription.append("}\n");
return classDescription.toString();
}
该describeMethod
方法接受a
MethodNode
并返回一个描述方法签名的字符串:
public String describeMethod(MethodNode methodNode) {
StringBuilder methodDescription = new StringBuilder();
Type returnType = Type.getReturnType(methodNode.desc);
Type[] argumentTypes = Type.getArgumentTypes(methodNode.desc);
@SuppressWarnings("unchecked")
List<String> thrownInternalClassNames = methodNode.exceptions;
if ((methodNode.access & Opcodes.ACC_PUBLIC) != 0) {
methodDescription.append("public ");
}
if ((methodNode.access & Opcodes.ACC_PRIVATE) != 0) {
methodDescription.append("private ");
}
if ((methodNode.access & Opcodes.ACC_PROTECTED) != 0) {
methodDescription.append("protected ");
}
if ((methodNode.access & Opcodes.ACC_STATIC) != 0) {
methodDescription.append("static ");
}
if ((methodNode.access & Opcodes.ACC_ABSTRACT) != 0) {
methodDescription.append("abstract ");
}
if ((methodNode.access & Opcodes.ACC_SYNCHRONIZED) != 0) {
methodDescription.append("synchronized ");
}
methodDescription.append(returnType.getClassName());
methodDescription.append(" ");
methodDescription.append(methodNode.name);
methodDescription.append("(");
for (int i = 0; i < argumentTypes.length; i++) {
Type argumentType = argumentTypes[i];
if (i > 0) {
methodDescription.append(", ");
}
methodDescription.append(argumentType.getClassName());
}
methodDescription.append(")");
if (!thrownInternalClassNames.isEmpty()) {
methodDescription.append(" throws ");
int i = 0;
for (String thrownInternalClassName : thrownInternalClassNames) {
if (i > 0) {
methodDescription.append(", ");
}
methodDescription.append(Type.getObjectType(thrownInternalClassName).getClassName());
i++;
}
}
return methodDescription.toString();
}
问题内容: 我正在使用此方法从JAR中的文本文件读取并正确工作。 现在,我要写入文件(从文件删除一行,通过从第一个文件写入第二个文件而没有特定的行)。 我使用此代码执行此操作: 但是java.lang.IllegalArgumentException发生了: 我的文件在Classpath中。 谢谢。 问题答案: 你不能那样做。 jar本身就是文件,而不是目录。它包含Java知道如何读取的资源。但是
本文向大家介绍Java将对象保存到文件中/从文件中读取对象的方法,包括了Java将对象保存到文件中/从文件中读取对象的方法的使用技巧和注意事项,需要的朋友参考一下 1.保存对象到文件中 Java语言只能将实现了Serializable接口的类的对象保存到文件中,利用如下方法即可: 参数obj一定要实现Serializable接口,否则会抛出java.io.NotSerializableExcept
本文向大家介绍asp导出excel文件最简单方便的方法,包括了asp导出excel文件最简单方便的方法的使用技巧和注意事项,需要的朋友参考一下 由于excel软件能识别table格式的数据,所以asp只需要输出table格式的html代码,同时设置好contenttype,增加保存为附件的响应头即可将输出的html代码保存为xls文件。 asp导出excel文件源代码如下:
问题内容: 我有一个很大的文件4GB,当我尝试读取它时,我的计算机挂起了。因此,我想逐个读取它,并且在处理完每个块之后,将已处理的块存储到另一个文件中并读取下一个块。 这些零件有什么方法吗? 我很想有一个简单的方法。 问题答案: 要编写一个简单函数,只需使用: 另一个选择是使用和辅助功能: 如果文件是基于行的,则文件对象已经是行的惰性生成器:
问题内容: 有没有一种简单的方法可以用golang解压缩文件? 现在我的代码是: 问题答案: OP的解决方案略作修改,以创建包含目录(如果不存在),并将文件提取/写入包装在闭包中,以消除每个@NickCraig-Wood注释的调用堆积: 注意: 更新后还包括Close()错误处理(如果我们正在寻找最佳实践,则不妨遵循所有最佳实践)。
问题内容: 为了进行调试,我需要在目录中递归搜索所有以UTF-8字节顺序标记(BOM)开头的文件。我当前的解决方案是一个简单的shell脚本: 或者,如果您希望使用简短的,难以理解的单线: 它不适用于包含换行符的文件名,但是无论如何都不会出现此类文件。 有没有更短或更优雅的解决方案? 是否有任何有趣的文本编辑器或文本编辑器宏? 问题答案: 这个简单的命令不仅找到而且清除了讨厌的BOM,该怎么办?: