件的处理程序的基础,仅重写基写入器来处理您想更改的事件。解析器(或读取器)和写 入器都是非常有用的独立组件。
ASM 2.X 全面支持 Java 5 JVM 更改,包括读取和写入签名。签 名的基本处理是通过直接传递给恰当的访问器方法的值自动实现的。另外,ASM 2.X 还增加了对签名字符 串(有时非常复杂)编码进行解析的支持,从而可翻译签名细节。按照 ASM 的基本原理,相同的接口还 可供写入器使用以按需生成签名字符串。在这一节中,我将介绍 ASM 如何将基本签名作为 text blob 处 理,又是如何详细解析基本签名的。
所有部分的签名
ASM 中将签名作为 text blob 处理 ,这一方式直接内建于基本类、字段和方法的访问器调用中。清单 3 展示了 org.objectweb.asm.ClassVisitor 接口中的相应方法:
清单 3. 类、字段和方法的访问器方法
public interface ClassVisitor
{
void visit(int version, int access, String name, String signature,
String superName, String[] interfaces);
FieldVisitor visitField(int access, String name, String desc,
String signature, Object value);
MethodVisitor visitMethod(int access, String name, String desc,
String signature, String[] exceptions);
...
}
清单中的各访问器方法将签名字符串作为 参数。若相应的类、字段或方法非泛型,则在调用方法时将返回 null 值。
清单 4 显示了签名相 关方法的实际应用。其中用 org.objectweb.asm.commons.EmptyVisitor 类作为基础实现了一个访问器类 ,这样我只需重写想使用的方法即可。所提供的方法实现仅输出整体签名信息、本清单所示类中各字段和 方法的描述符和签名信息。清单 4 的末尾处展示了在 清单 1 所示的完整 DirInfo 类中使用此访问器时 所生成的输出:
清单 4. 签名相关方法的实际应用
public class ShowSignaturesVisitor extends EmptyVisitor
{
public void visit(int version, int access, String name, String sig,
String sname, String[] inames) {
System.out.println("Class " + name + " signature:");
System.out.println(" " + sig);
super.visit(version, access, name, sig, sname, inames);
}
public FieldVisitor visitField(int access, String name, String desc,
String sig, Object value) {
System.out.println("Field " + name + " descriptor and signature:");
System.out.println(" " + desc);
System.out.println(" " + sig);
return super.visitField(access, name, desc, sig, value);
}
public MethodVisitor visitMethod(int access, String name, String desc,
String sig, String[] exceptions) {
System.out.println("Method " + name + "() descriptor and signature:");
System.out.println(" " + desc);
System.out.println(" " + sig);
return super.visitMethod(access, name, desc, sig, exceptions);
}
}
Class com/sosnoski/generics/DirInfo signature:
null
Field m_files descriptor and signature:
Ljava/util/List;
Ljava/util/List<Lcom/sosnoski/generics/FileInfo;>;
Field m_directories d
|