This is a very good post in Chinese to talk about the entrance level information of ASM and Java bytecode. I change the code slightly so that I have better output and use JUnit to drive the the output.
Here is the code
@Test
public void testMethodA() throws Exception {
ClassReader reader = new ClassReader("foo.ForReadClass");
ClassNode cn = new ClassNode();
reader.accept(cn, 0);
System.out.println(cn.name);
@SuppressWarnings("unchecked")
List<fieldnode> fields = cn.fields;
printFieldNodes(fields);
}
private void printFieldNodes(List<fieldnode> fieldList) {
for(FieldNode fieldNode : fieldList) {
System.out.printf("Field name=%s, desc=%s, value=%s, access=%d\n",
fieldNode.name,
fieldNode.desc,
fieldNode.value,
fieldNode.access);
if(fieldNode.visibleAnnotations != null) {
for(Object anNode : fieldNode.visibleAnnotations) {
System.out.println(((AnnotationNode)anNode).desc);
}
}
}
}
@Test
public void testMethodA2() throws Exception {
ClassReader reader = new ClassReader(foo.ForReadClass.class.getName());
ClassNode cn = new ClassNode();
reader.accept(cn, 0);
@SuppressWarnings("unchecked")
List<methodnode> methodList = cn.methods;
for(MethodNode md : methodList)
{
System.out.printf("Method Node name = %s, access = %d, desc = %s, signature = %s\n",
md.name,
md.access,
md.desc,
md.signature);
@SuppressWarnings("unchecked")
List<localvariablenode> lvNodeList = md.localVariables;
for(LocalVariableNode lvn : lvNodeList) {
System.out.printf("\tLocal Variable name = %s, label = %s, desc = %s, sign = %s\n",
lvn.name,
lvn.start.getLabel(),
lvn.desc,
lvn.signature);
}
@SuppressWarnings("unchecked")
Iterator<abstractinsnnode< instraIter = md.instructions.iterator();
while(instraIter.hasNext()) {
AbstractInsnNode abi = instraIter.next();
if(abi instanceof LdcInsnNode) {
LdcInsnNode ldcI = (LdcInsnNode) abi;
System.out.println("\tLDC node value : " + ldcI.cst);
}
}
}
MethodVisitor mv = cn.visitMethod(Opcodes.AALOAD, "<init>", Type.getType(String.class).toString(), null, null);
mv.visitFieldInsn(Opcodes.GETFIELD, Type.getInternalName(String.class), "str", Type.getType(String.class).toString());
System.out.println(cn.name);
@SuppressWarnings("unchecked")
List<fieldnode> fieldList = cn.fields;
printFieldNodes(fieldList);
}
hello world
No comments:
Post a Comment