📄 asmcontenthandler.java.old
字号:
case IINC_INSN:
getMethodVisitor().visitIincInsn(Integer.parseInt(attrs.getValue("var")), Integer.parseInt(attrs.getValue("inc")));
break;
case TABLESWITCH_INSN:
vals = new HashMap();
vals.put("min", attrs.getValue("min"));
vals.put("max", attrs.getValue("max"));
vals.put("dflt", attrs.getValue("dflt"));
vals.put("labels", new ArrayList());
push(vals);
break;
case LOOKUPSWITCH_INSN:
vals = new HashMap();
vals.put("dflt", attrs.getValue("dflt"));
vals.put("labels", new ArrayList());
vals.put("keys", new ArrayList());
push(vals);
break;
case MULTIANEWARRAY_INSN:
getMethodVisitor().visitMultiANewArrayInsn(attrs.getValue("desc"), Integer.parseInt(attrs.getValue("dims")));
break;
}
}
private void end (int element) {
Map vals;
int access;
String name, desc, signature;
Label dflt;
Label[] lbls;
switch (element >> 8) {
case INTERFACES:
vals = (Map)pop();
int version = ((Integer)vals.get("version")).intValue();
access = getAccess((String)vals.get("access"));
name = (String)vals.get("name");
signature = (String)vals.get("signature");
String parent = (String)vals.get("parent");
String[] interfaces = (String[])((List)vals.get("interfaces")).toArray(new String[0]);
cw.visit(version, access, name, signature, parent, interfaces);
push(cw);
break;
case ANNOTATION:
case ANNOTATION_DEFAULT:
case PARAMETER_ANNOTATION:
case ANNOTATION_VALUE_ANNOTATION:
case ANNOTATION_VALUE_ARRAY:
((AnnotationVisitor)pop()).visitEnd();
break;
case FIELD:
((FieldVisitor)pop()).visitEnd();
break;
case METHOD:
((MethodVisitor)pop()).visitEnd();
labels = null;
break;
case EXCEPTIONS:
vals = (Map)pop();
access = getAccess((String)vals.get("access"));
name = (String)vals.get("name");
desc = (String)vals.get("desc");
signature = (String)vals.get("signature");
String[] exceptions = (String[])((List)vals.get("exceptions")).toArray(new String[0]);
push(cw.visitMethod(access, name, desc, signature, exceptions));
break;
case TABLESWITCH_INSN:
vals = (Map)pop();
int min = Integer.parseInt((String)vals.get("min"));
int max = Integer.parseInt((String)vals.get("max"));
dflt = getLabel(vals.get("dflt"));
lbls = (Label[])((List)vals.get("labels")).toArray(new Label[0]);
getMethodVisitor().visitTableSwitchInsn(min, max, dflt, lbls);
break;
case LOOKUPSWITCH_INSN:
vals = (Map)pop();
dflt = getLabel(vals.get("dflt"));
List keyList = (List)vals.get("keys");
lbls = (Label[])((List)vals.get("labels")).toArray(new Label[0]);
int[] keys = new int[keyList.size()];
for (int i = 0; i < keys.length; i++) {
keys[i] = Integer.parseInt((String)keyList.get(i));
}
getMethodVisitor().visitLookupSwitchInsn(dflt, keys, lbls);
break;
}
}
private static int hashcode (final Object o) {
int h = o.hashCode();
return Math.abs(h*h) % MAP.length;
}
private static int getAccess (final String s) {
int access = 0;
if (s.indexOf("public") != -1)
access |= Opcodes.ACC_PUBLIC;
if (s.indexOf("private") != -1)
access |= Opcodes.ACC_PRIVATE;
if (s.indexOf("protected") != -1)
access |= Opcodes.ACC_PROTECTED;
if (s.indexOf("static") != -1)
access |= Opcodes.ACC_STATIC;
if (s.indexOf("final") != -1)
access |= Opcodes.ACC_FINAL;
if (s.indexOf("super") != -1)
access |= Opcodes.ACC_SUPER;
if (s.indexOf("synchronized") != -1)
access |= Opcodes.ACC_SYNCHRONIZED;
if (s.indexOf("volatile") != -1)
access |= Opcodes.ACC_VOLATILE;
if (s.indexOf("bridge") != -1)
access |= Opcodes.ACC_BRIDGE;
if (s.indexOf("varargs") != -1)
access |= Opcodes.ACC_VARARGS;
if (s.indexOf("transient") != -1)
access |= Opcodes.ACC_TRANSIENT;
if (s.indexOf("native") != -1)
access |= Opcodes.ACC_NATIVE;
if (s.indexOf("interface") != -1)
access |= Opcodes.ACC_INTERFACE;
if (s.indexOf("abstract") != -1)
access |= Opcodes.ACC_ABSTRACT;
if (s.indexOf("strict") != -1)
access |= Opcodes.ACC_STRICT;
if (s.indexOf("synthetic") != -1)
access |= Opcodes.ACC_SYNTHETIC;
if (s.indexOf("annotation") != -1)
access |= Opcodes.ACC_ANNOTATION;
if (s.indexOf("enum") != -1)
access |= Opcodes.ACC_ENUM;
if (s.indexOf("deprecated") != -1)
access |= Opcodes.ACC_DEPRECATED;
return access;
}
private final static String decode (final String val) {
StringBuffer sb = new StringBuffer(val.length());
try {
int n = 0;
while (n < val.length()) {
char c = val.charAt(n);
if (c == '\\') {
n++;
c = val.charAt(n);
if (c == '\\') {
sb.append('\\');
} else {
n++; // skip 'u'
sb.append((char)Integer.parseInt(val.substring(n, n + 4), 16));
n += 3;
}
} else {
sb.append(c);
}
n++;
}
} catch (RuntimeException ex) {
System.err.println(val + "\n" + ex.toString());
ex.printStackTrace();
throw ex;
}
return sb.toString();
}
private final static Object getValue (String desc, String val) {
Object value = null;
if (val != null) {
if (desc.equals("Ljava/lang/String;")) {
value = decode(val);
} else if ("Ljava/lang/Integer;".equals(desc) || "I".equals(desc)
|| "S".equals(desc) || "B".equals(desc) || "C".equals(desc)
|| desc.equals("Z")) {
value = new Integer(val);
} else if ("Ljava/lang/Short;".equals(desc)) {
value = new Short(val);
} else if ("Ljava/lang/Byte;".equals(desc)) {
value = new Byte(val);
} else if ("Ljava/lang/Character;".equals(desc)) {
value = new Character(decode(val).charAt(0));
} else if ("Ljava/lang/Boolean;".equals(desc)) {
value = Boolean.valueOf(val);
/*
* } else if( "Ljava/lang/Integer;".equals( desc) || desc.equals( "I")) {
* value = new Integer( val); } else if( "Ljava/lang/Character;".equals(
* desc) || desc.equals( "C")) { value = new Character( decode(
* val).charAt( 0)); } else if( "Ljava/lang/Short;".equals( desc) ||
* desc.equals( "S")) { value = Short.valueOf( val); } else if(
* "Ljava/lang/Byte;".equals( desc) || desc.equals( "B")) { value =
* Byte.valueOf( val);
*/
} else if ("Ljava/lang/Long;".equals(desc) || desc.equals("J")) {
value = new Long(val);
} else if ("Ljava/lang/Float;".equals(desc) || desc.equals("F")) {
value = new Float(val);
} else if ("Ljava/lang/Double;".equals(desc) || desc.equals("D")) {
value = new Double(val);
} else if (Type.getDescriptor(Type.class).equals(desc)) {
value = Type.getType(val);
/*
* } else if( "[I".equals( desc)) { value = new int[ 0]; // TODO } else
* if( "[C".equals( desc)) { value = new char[ 0]; // TODO } else if(
* "[Z".equals( desc)) { value = new boolean[ 0]; // TODO } else if(
* "[S".equals( desc)) { value = new short[ 0]; // TODO } else if(
* "[B".equals( desc)) { value = new byte[ 0]; // TODO } else if(
* "[J".equals( desc)) { value = new long[ 0]; // TODO } else if(
* "[F".equals( desc)) { value = new float[ 0]; // TODO } else if(
* "[D".equals( desc)) { value = new double[ 0]; // TODO
*/
} else {
throw new RuntimeException("Invalid value:" + val + " desc:" + desc);
}
}
return value;
}
/**
* Return the top object on the stack without removing it. If there are no
* objects on the stack, return <code>null</code>.
*/
private Object peek () {
return stack.size() == 0 ? null : stack.get(stack.size() - 1);
}
private MethodVisitor getMethodVisitor () {
return (MethodVisitor)peek();
}
/**
* Pop the top object off of the stack, and return it. If there are
* no objects on the stack, return <code>null</code>.
*/
private Object pop () {
return stack.size() == 0 ? null : stack.remove(stack.size() - 1);
}
/**
* Push a new object onto the top of the object stack.
*
* @param object The new object
*/
private void push (Object object) {
stack.add(object);
}
private Label getLabel (Object label) {
Label lbl = (Label)labels.get(label);
if (lbl == null) {
lbl = new Label();
labels.put(label, lbl);
}
return lbl;
}
/**
* Returns the bytecode of the class that was build with underneath class writer.
*
* @return the bytecode of the class that was build with underneath class writer or
* null if there are no classwriter created.
*/
public byte[] toByteArray () {
return cw == null ? null : cw.toByteArray();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -