use of org.objectweb.asm.FieldVisitor in project qi4j-sdk by Qi4j.
the class TransientClassLoader method generateClass.
public static byte[] generateClass(String name, Class baseClass) throws ClassNotFoundException {
String classSlash = name.replace('.', '/');
String baseClassSlash = getInternalName(baseClass);
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
FieldVisitor fv;
MethodVisitor mv;
AnnotationVisitor av0;
// Class definition start
cw.visit(jdkVersion, ACC_PUBLIC + ACC_SUPER, classSlash, null, baseClassSlash, null);
// Composite reference
{
fv = cw.visitField(ACC_PUBLIC, "_instance", "Lorg/qi4j/api/composite/CompositeInvoker;", null, null);
fv.visitEnd();
}
// Static Method references
{
int idx = 1;
for (Method method : baseClass.getMethods()) {
if (isOverloaded(method, baseClass)) {
fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "m" + idx++, "Ljava/lang/reflect/Method;", null, null);
fv.visitEnd();
}
}
}
// Constructors
for (Constructor constructor : baseClass.getDeclaredConstructors()) {
if (Modifier.isPublic(constructor.getModifiers()) || Modifier.isProtected(constructor.getModifiers())) {
String desc = org.objectweb.asm.commons.Method.getMethod(constructor).getDescriptor();
mv = cw.visitMethod(ACC_PUBLIC, "<init>", desc, null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
int idx = 1;
for (Class aClass : constructor.getParameterTypes()) {
// TODO Handle other types than objects (?)
mv.visitVarInsn(ALOAD, idx++);
}
mv.visitMethodInsn(INVOKESPECIAL, baseClassSlash, "<init>", desc);
mv.visitInsn(RETURN);
mv.visitMaxs(idx, idx);
mv.visitEnd();
}
}
// Overloaded and unimplemented methods
Method[] methods = baseClass.getMethods();
int idx = 0;
List<Label> exceptionLabels = new ArrayList<Label>();
for (Method method : methods) {
if (isOverloaded(method, baseClass)) {
idx++;
String methodName = method.getName();
String desc = org.objectweb.asm.commons.Method.getMethod(method).getDescriptor();
String[] exceptions = null;
{
mv = cw.visitMethod(ACC_PUBLIC, methodName, desc, null, exceptions);
if (isInternalQi4jMethod(method, baseClass)) {
// generate a NoOp method...
mv.visitInsn(RETURN);
} else {
// Use this if return type is void
Label endLabel = null;
if (method.getExceptionTypes().length > 0) {
exceptions = new String[method.getExceptionTypes().length];
for (int i = 0; i < method.getExceptionTypes().length; i++) {
Class<?> aClass = method.getExceptionTypes()[i];
exceptions[i] = getInternalName(aClass);
}
}
mv.visitCode();
Label l0 = new Label();
Label l1 = new Label();
exceptionLabels.clear();
for (Class<?> declaredException : method.getExceptionTypes()) {
Label ld = new Label();
mv.visitTryCatchBlock(l0, l1, ld, getInternalName(declaredException));
// Reuse this further down for the catch
exceptionLabels.add(ld);
}
Label lruntime = new Label();
mv.visitTryCatchBlock(l0, l1, lruntime, "java/lang/RuntimeException");
Label lerror = new Label();
mv.visitTryCatchBlock(l0, l1, lerror, "java/lang/Throwable");
mv.visitLabel(l0);
mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, classSlash, "_instance", "Lorg/qi4j/api/composite/CompositeInvoker;");
mv.visitFieldInsn(GETSTATIC, classSlash, "m" + idx, "Ljava/lang/reflect/Method;");
int paramCount = method.getParameterTypes().length;
int stackIdx = 0;
if (paramCount == 0) {
// Send in null as parameter
mv.visitInsn(ACONST_NULL);
} else {
insn(mv, paramCount);
mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
int pidx = 0;
for (Class<?> aClass : method.getParameterTypes()) {
mv.visitInsn(DUP);
insn(mv, pidx++);
stackIdx = wrapParameter(mv, aClass, stackIdx + 1);
mv.visitInsn(AASTORE);
}
}
// Call method
mv.visitMethodInsn(INVOKEINTERFACE, "org/qi4j/api/composite/CompositeInvoker", "invokeComposite", "(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;");
// Return value
if (!method.getReturnType().equals(Void.TYPE)) {
unwrapResult(mv, method.getReturnType(), l1);
} else {
mv.visitInsn(POP);
mv.visitLabel(l1);
endLabel = new Label();
mv.visitJumpInsn(GOTO, endLabel);
}
// Increase stack to beyond method args
stackIdx++;
// Declared exceptions
int exceptionIdx = 0;
for (Class<?> aClass : method.getExceptionTypes()) {
mv.visitLabel(exceptionLabels.get(exceptionIdx++));
mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { getInternalName(aClass) });
mv.visitVarInsn(ASTORE, stackIdx);
mv.visitVarInsn(ALOAD, stackIdx);
mv.visitInsn(ATHROW);
}
// RuntimeException and Error catch-all
mv.visitLabel(lruntime);
mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/RuntimeException" });
mv.visitVarInsn(ASTORE, stackIdx);
mv.visitVarInsn(ALOAD, stackIdx);
mv.visitInsn(ATHROW);
mv.visitLabel(lerror);
mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/Throwable" });
mv.visitVarInsn(ASTORE, stackIdx);
mv.visitVarInsn(ALOAD, stackIdx);
mv.visitTypeInsn(CHECKCAST, "java/lang/Error");
mv.visitInsn(ATHROW);
// Return type = void
if (endLabel != null) {
mv.visitLabel(endLabel);
mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
mv.visitInsn(RETURN);
}
mv.visitMaxs(0, 0);
mv.visitEnd();
}
}
if (!Modifier.isAbstract(method.getModifiers())) {
// Add method with _ as prefix
mv = cw.visitMethod(ACC_PUBLIC, "_" + method.getName(), desc, null, exceptions);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
// Parameters
int stackIdx = 1;
for (Class<?> aClass : method.getParameterTypes()) {
stackIdx = loadParameter(mv, aClass, stackIdx) + 1;
}
// Call method
mv.visitMethodInsn(INVOKESPECIAL, baseClassSlash, method.getName(), desc);
// Return value
if (!method.getReturnType().equals(Void.TYPE)) {
returnResult(mv, method.getReturnType());
} else {
mv.visitInsn(RETURN);
}
mv.visitMaxs(1, 1);
mv.visitEnd();
}
}
}
// Class initializer
{
mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
mv.visitCode();
Label l0 = new Label();
Label l1 = new Label();
Label l2 = new Label();
mv.visitTryCatchBlock(l0, l1, l2, "java/lang/NoSuchMethodException");
mv.visitLabel(l0);
// Lookup methods and store in static variables
int midx = 0;
for (Method method : methods) {
if (isOverloaded(method, baseClass)) {
method.setAccessible(true);
Class methodClass;
methodClass = method.getDeclaringClass();
midx++;
mv.visitLdcInsn(Type.getType(methodClass));
mv.visitLdcInsn(method.getName());
insn(mv, method.getParameterTypes().length);
mv.visitTypeInsn(ANEWARRAY, "java/lang/Class");
int pidx = 0;
for (Class<?> aClass : method.getParameterTypes()) {
mv.visitInsn(DUP);
insn(mv, pidx++);
type(mv, aClass);
mv.visitInsn(AASTORE);
}
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;");
mv.visitFieldInsn(PUTSTATIC, classSlash, "m" + midx, "Ljava/lang/reflect/Method;");
}
}
mv.visitLabel(l1);
Label l3 = new Label();
mv.visitJumpInsn(GOTO, l3);
mv.visitLabel(l2);
mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/NoSuchMethodException" });
mv.visitVarInsn(ASTORE, 0);
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/NoSuchMethodException", "printStackTrace", "()V");
mv.visitLabel(l3);
mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
mv.visitInsn(RETURN);
mv.visitMaxs(6, 1);
mv.visitEnd();
}
cw.visitEnd();
return cw.toByteArray();
}
use of org.objectweb.asm.FieldVisitor in project qi4j-sdk by Qi4j.
the class ASMTest method generateClass.
// This is the code generated from the manual stub
private static byte[] generateClass() {
ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;
MethodVisitor mv;
AnnotationVisitor av0;
cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, "org/qi4j/satisfiedBy/SomeMixin_Stub", null, "org/qi4j/satisfiedBy/SomeMixin", null);
{
fv = cw.visitField(ACC_PUBLIC, "_instance", "Lorg/qi4j/spi/composite/CompositeInvoker;", null, null);
fv.visitEnd();
}
{
fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "m1", "Ljava/lang/reflect/Method;", null, null);
fv.visitEnd();
}
{
fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "m2", "Ljava/lang/reflect/Method;", null, null);
fv.visitEnd();
}
{
fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "m3", "Ljava/lang/reflect/Method;", null, null);
fv.visitEnd();
}
{
fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "m4", "Ljava/lang/reflect/Method;", null, null);
fv.visitEnd();
}
{
fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "m5", "Ljava/lang/reflect/Method;", null, null);
fv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "org/qi4j/satisfiedBy/SomeMixin", "<init>", "()V");
mv.visitInsn(RETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Ljava/lang/String;)V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKESPECIAL, "org/qi4j/satisfiedBy/SomeMixin", "<init>", "(Ljava/lang/String;)V");
mv.visitInsn(RETURN);
mv.visitMaxs(2, 2);
mv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC, "other", "()Ljava/lang/String;", null, null);
mv.visitCode();
Label l0 = new Label();
Label l1 = new Label();
Label l2 = new Label();
mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Throwable");
mv.visitLabel(l0);
mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, "org/qi4j/satisfiedBy/SomeMixin_Stub", "_instance", "Lorg/qi4j/spi/composite/CompositeInvoker;");
mv.visitFieldInsn(GETSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m1", "Ljava/lang/reflect/Method;");
mv.visitInsn(ACONST_NULL);
mv.visitMethodInsn(INVOKEINTERFACE, "org/qi4j/spi/composite/CompositeInvoker", "invokeComposite", "(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;");
mv.visitTypeInsn(CHECKCAST, "java/lang/String");
mv.visitLabel(l1);
mv.visitInsn(ARETURN);
mv.visitLabel(l2);
mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/Throwable" });
mv.visitVarInsn(ASTORE, 1);
mv.visitTypeInsn(NEW, "java/lang/reflect/UndeclaredThrowableException");
mv.visitInsn(DUP);
mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>", "(Ljava/lang/Throwable;)V");
mv.visitInsn(ATHROW);
mv.visitMaxs(3, 2);
mv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC, "foo", "(Ljava/lang/String;I)Ljava/lang/String;", null, new String[] { "java/lang/IllegalArgumentException" });
mv.visitCode();
Label l0 = new Label();
Label l1 = new Label();
Label l2 = new Label();
mv.visitTryCatchBlock(l0, l1, l2, "java/lang/IllegalArgumentException");
Label l3 = new Label();
mv.visitTryCatchBlock(l0, l1, l3, "java/lang/Throwable");
mv.visitLabel(l0);
mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, "org/qi4j/satisfiedBy/SomeMixin_Stub", "_instance", "Lorg/qi4j/spi/composite/CompositeInvoker;");
mv.visitFieldInsn(GETSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m2", "Ljava/lang/reflect/Method;");
mv.visitInsn(ICONST_2);
mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
mv.visitInsn(DUP);
mv.visitInsn(ICONST_0);
mv.visitVarInsn(ALOAD, 1);
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_1);
mv.visitVarInsn(ILOAD, 2);
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;");
mv.visitInsn(AASTORE);
mv.visitMethodInsn(INVOKEINTERFACE, "org/qi4j/spi/composite/CompositeInvoker", "invokeComposite", "(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;");
mv.visitTypeInsn(CHECKCAST, "java/lang/String");
mv.visitLabel(l1);
mv.visitInsn(ARETURN);
mv.visitLabel(l2);
mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/IllegalArgumentException" });
mv.visitVarInsn(ASTORE, 3);
mv.visitVarInsn(ALOAD, 3);
mv.visitInsn(ATHROW);
mv.visitLabel(l3);
mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/Throwable" });
mv.visitVarInsn(ASTORE, 3);
mv.visitTypeInsn(NEW, "java/lang/reflect/UndeclaredThrowableException");
mv.visitInsn(DUP);
mv.visitVarInsn(ALOAD, 3);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>", "(Ljava/lang/Throwable;)V");
mv.visitInsn(ATHROW);
mv.visitMaxs(6, 4);
mv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC, "bar", "(DZFCIJSBLjava/lang/Double;[Ljava/lang/Object;[I)V", null, null);
mv.visitCode();
Label l0 = new Label();
Label l1 = new Label();
Label l2 = new Label();
mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Throwable");
mv.visitLabel(l0);
mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, "org/qi4j/satisfiedBy/SomeMixin_Stub", "_instance", "Lorg/qi4j/spi/composite/CompositeInvoker;");
mv.visitFieldInsn(GETSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m3", "Ljava/lang/reflect/Method;");
mv.visitIntInsn(BIPUSH, 11);
mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
mv.visitInsn(DUP);
mv.visitInsn(ICONST_0);
mv.visitVarInsn(DLOAD, 1);
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_1);
mv.visitVarInsn(ILOAD, 3);
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_2);
mv.visitVarInsn(FLOAD, 4);
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Float", "valueOf", "(F)Ljava/lang/Float;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_3);
mv.visitVarInsn(ILOAD, 5);
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Character", "valueOf", "(C)Ljava/lang/Character;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_4);
mv.visitVarInsn(ILOAD, 6);
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_5);
mv.visitVarInsn(LLOAD, 7);
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitIntInsn(BIPUSH, 6);
mv.visitVarInsn(ILOAD, 9);
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Short", "valueOf", "(S)Ljava/lang/Short;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitIntInsn(BIPUSH, 7);
mv.visitVarInsn(ILOAD, 10);
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Byte", "valueOf", "(B)Ljava/lang/Byte;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitIntInsn(BIPUSH, 8);
mv.visitVarInsn(ALOAD, 11);
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitIntInsn(BIPUSH, 9);
mv.visitVarInsn(ALOAD, 12);
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitIntInsn(BIPUSH, 10);
mv.visitVarInsn(ALOAD, 13);
mv.visitInsn(AASTORE);
mv.visitMethodInsn(INVOKEINTERFACE, "org/qi4j/spi/composite/CompositeInvoker", "invokeComposite", "(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;");
mv.visitInsn(POP);
mv.visitLabel(l1);
Label l3 = new Label();
mv.visitJumpInsn(GOTO, l3);
mv.visitLabel(l2);
mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/Throwable" });
mv.visitVarInsn(ASTORE, 14);
mv.visitTypeInsn(NEW, "java/lang/reflect/UndeclaredThrowableException");
mv.visitInsn(DUP);
mv.visitVarInsn(ALOAD, 14);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>", "(Ljava/lang/Throwable;)V");
mv.visitInsn(ATHROW);
mv.visitLabel(l3);
mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
mv.visitInsn(RETURN);
mv.visitMaxs(7, 15);
mv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC, "multiEx", "(Ljava/lang/String;)V", null, new String[] { "org/qi4j/satisfiedBy/Exception1", "org/qi4j/satisfiedBy/Exception2" });
mv.visitCode();
Label l0 = new Label();
Label l1 = new Label();
Label l2 = new Label();
mv.visitTryCatchBlock(l0, l1, l2, "org/qi4j/satisfiedBy/Exception1");
Label l3 = new Label();
mv.visitTryCatchBlock(l0, l1, l3, "org/qi4j/satisfiedBy/Exception2");
Label l4 = new Label();
mv.visitTryCatchBlock(l0, l1, l4, "java/lang/Throwable");
mv.visitLabel(l0);
mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, "org/qi4j/satisfiedBy/SomeMixin_Stub", "_instance", "Lorg/qi4j/spi/composite/CompositeInvoker;");
mv.visitFieldInsn(GETSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m4", "Ljava/lang/reflect/Method;");
mv.visitInsn(ICONST_1);
mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
mv.visitInsn(DUP);
mv.visitInsn(ICONST_0);
mv.visitVarInsn(ALOAD, 1);
mv.visitInsn(AASTORE);
mv.visitMethodInsn(INVOKEINTERFACE, "org/qi4j/spi/composite/CompositeInvoker", "invokeComposite", "(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;");
mv.visitInsn(POP);
mv.visitLabel(l1);
Label l5 = new Label();
mv.visitJumpInsn(GOTO, l5);
mv.visitLabel(l2);
mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "org/qi4j/satisfiedBy/Exception1" });
mv.visitVarInsn(ASTORE, 2);
mv.visitVarInsn(ALOAD, 2);
mv.visitInsn(ATHROW);
mv.visitLabel(l3);
mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "org/qi4j/satisfiedBy/Exception2" });
mv.visitVarInsn(ASTORE, 2);
mv.visitVarInsn(ALOAD, 2);
mv.visitInsn(ATHROW);
mv.visitLabel(l4);
mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/Throwable" });
mv.visitVarInsn(ASTORE, 2);
mv.visitTypeInsn(NEW, "java/lang/reflect/UndeclaredThrowableException");
mv.visitInsn(DUP);
mv.visitVarInsn(ALOAD, 2);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>", "(Ljava/lang/Throwable;)V");
mv.visitInsn(ATHROW);
mv.visitLabel(l5);
mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
mv.visitInsn(RETURN);
mv.visitMaxs(6, 3);
mv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC, "unwrapResult", "()I", null, null);
mv.visitCode();
Label l0 = new Label();
Label l1 = new Label();
Label l2 = new Label();
mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Throwable");
mv.visitLabel(l0);
mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, "org/qi4j/satisfiedBy/SomeMixin_Stub", "_instance", "Lorg/qi4j/spi/composite/CompositeInvoker;");
mv.visitFieldInsn(GETSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m5", "Ljava/lang/reflect/Method;");
mv.visitInsn(ACONST_NULL);
mv.visitMethodInsn(INVOKEINTERFACE, "org/qi4j/spi/composite/CompositeInvoker", "invokeComposite", "(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;");
mv.visitTypeInsn(CHECKCAST, "java/lang/Integer");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I");
mv.visitLabel(l1);
mv.visitInsn(IRETURN);
mv.visitLabel(l2);
mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/Throwable" });
mv.visitVarInsn(ASTORE, 1);
mv.visitTypeInsn(NEW, "java/lang/reflect/UndeclaredThrowableException");
mv.visitInsn(DUP);
mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>", "(Ljava/lang/Throwable;)V");
mv.visitInsn(ATHROW);
mv.visitMaxs(3, 2);
mv.visitEnd();
}
{
mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
mv.visitCode();
Label l0 = new Label();
Label l1 = new Label();
Label l2 = new Label();
mv.visitTryCatchBlock(l0, l1, l2, "java/lang/NoSuchMethodException");
mv.visitLabel(l0);
mv.visitLdcInsn(Type.getType("Lorg/qi4j/satisfiedBy/Other;"));
mv.visitLdcInsn("other");
mv.visitInsn(ICONST_0);
mv.visitTypeInsn(ANEWARRAY, "java/lang/Class");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;");
mv.visitFieldInsn(PUTSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m1", "Ljava/lang/reflect/Method;");
mv.visitLdcInsn(Type.getType("Lorg/qi4j/satisfiedBy/Other;"));
mv.visitLdcInsn("foo");
mv.visitInsn(ICONST_2);
mv.visitTypeInsn(ANEWARRAY, "java/lang/Class");
mv.visitInsn(DUP);
mv.visitInsn(ICONST_0);
mv.visitLdcInsn(Type.getType("Ljava/lang/String;"));
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_1);
mv.visitFieldInsn(GETSTATIC, "java/lang/Integer", "TYPE", "Ljava/lang/Class;");
mv.visitInsn(AASTORE);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;");
mv.visitFieldInsn(PUTSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m2", "Ljava/lang/reflect/Method;");
mv.visitLdcInsn(Type.getType("Lorg/qi4j/satisfiedBy/Other;"));
mv.visitLdcInsn("bar");
mv.visitIntInsn(BIPUSH, 11);
mv.visitTypeInsn(ANEWARRAY, "java/lang/Class");
mv.visitInsn(DUP);
mv.visitInsn(ICONST_0);
mv.visitFieldInsn(GETSTATIC, "java/lang/Double", "TYPE", "Ljava/lang/Class;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_1);
mv.visitFieldInsn(GETSTATIC, "java/lang/Boolean", "TYPE", "Ljava/lang/Class;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_2);
mv.visitFieldInsn(GETSTATIC, "java/lang/Float", "TYPE", "Ljava/lang/Class;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_3);
mv.visitFieldInsn(GETSTATIC, "java/lang/Character", "TYPE", "Ljava/lang/Class;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_4);
mv.visitFieldInsn(GETSTATIC, "java/lang/Integer", "TYPE", "Ljava/lang/Class;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_5);
mv.visitFieldInsn(GETSTATIC, "java/lang/Long", "TYPE", "Ljava/lang/Class;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitIntInsn(BIPUSH, 6);
mv.visitFieldInsn(GETSTATIC, "java/lang/Short", "TYPE", "Ljava/lang/Class;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitIntInsn(BIPUSH, 7);
mv.visitFieldInsn(GETSTATIC, "java/lang/Byte", "TYPE", "Ljava/lang/Class;");
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitIntInsn(BIPUSH, 8);
mv.visitLdcInsn(Type.getType("Ljava/lang/Double;"));
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitIntInsn(BIPUSH, 9);
mv.visitLdcInsn(Type.getType("[Ljava/lang/Object;"));
mv.visitInsn(AASTORE);
mv.visitInsn(DUP);
mv.visitIntInsn(BIPUSH, 10);
mv.visitLdcInsn(Type.getType("[I"));
mv.visitInsn(AASTORE);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;");
mv.visitFieldInsn(PUTSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m3", "Ljava/lang/reflect/Method;");
mv.visitLdcInsn(Type.getType("Lorg/qi4j/satisfiedBy/Other;"));
mv.visitLdcInsn("multiEx");
mv.visitInsn(ICONST_1);
mv.visitTypeInsn(ANEWARRAY, "java/lang/Class");
mv.visitInsn(DUP);
mv.visitInsn(ICONST_0);
mv.visitLdcInsn(Type.getType("Ljava/lang/String;"));
mv.visitInsn(AASTORE);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;");
mv.visitFieldInsn(PUTSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m4", "Ljava/lang/reflect/Method;");
mv.visitLdcInsn(Type.getType("Lorg/qi4j/satisfiedBy/Other;"));
mv.visitLdcInsn("unwrapResult");
mv.visitInsn(ICONST_0);
mv.visitTypeInsn(ANEWARRAY, "java/lang/Class");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;");
mv.visitFieldInsn(PUTSTATIC, "org/qi4j/satisfiedBy/SomeMixin_Stub", "m5", "Ljava/lang/reflect/Method;");
mv.visitLabel(l1);
Label l3 = new Label();
mv.visitJumpInsn(GOTO, l3);
mv.visitLabel(l2);
mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/NoSuchMethodException" });
mv.visitVarInsn(ASTORE, 0);
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/NoSuchMethodException", "printStackTrace", "()V");
mv.visitLabel(l3);
mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
mv.visitInsn(RETURN);
mv.visitMaxs(6, 1);
mv.visitEnd();
}
cw.visitEnd();
return cw.toByteArray();
}
use of org.objectweb.asm.FieldVisitor in project LogisticsPipes by RS485.
the class LogisticsWrapperHandler method getWrappedProxy.
@SuppressWarnings("unchecked")
public static <T> T getWrappedProxy(String modId, Class<T> interfaze, Class<? extends T> proxyClazz, T dummyProxy, Class<?>... wrapperInterfaces) throws SecurityException, IllegalArgumentException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException {
String proxyName = interfaze.getSimpleName().substring(1);
if (!proxyName.endsWith("Proxy")) {
throw new RuntimeException("UnuportedProxyName: " + proxyName);
}
proxyName = proxyName.substring(0, proxyName.length() - 5);
String className = "logisticspipes/asm/wrapper/generated/" + proxyName + "ProxyWrapper";
boolean ignoreModLoaded = false;
if (modId.startsWith("!")) {
ignoreModLoaded = true;
modId = modId.substring(1);
}
List<Class<?>> wrapperInterfacesList = Arrays.asList(wrapperInterfaces);
Class<?> clazz;
synchronized (lookupMap) {
clazz = LogisticsWrapperHandler.lookupMap.get(className);
if (clazz == null) {
String fieldName = interfaze.getName().replace('.', '/');
// String classFile = interfaze.getSimpleName().substring(1) + "Wrapper.java";
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
cw.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, className, null, "logisticspipes/asm/wrapper/AbstractWrapper", new String[] { fieldName });
cw.visitSource(".LP|ASM.dynamic", null);
{
FieldVisitor fv = cw.visitField(Opcodes.ACC_PRIVATE, "proxy", "L" + fieldName + ";", null, null);
fv.visitEnd();
}
{
FieldVisitor fv = cw.visitField(Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL, "dummyProxy", "L" + fieldName + ";", null, null);
fv.visitEnd();
}
{
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "(L" + fieldName + ";L" + fieldName + ";)V", null, null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(11, l0);
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "logisticspipes/asm/wrapper/AbstractWrapper", "<init>", "()V");
Label l1 = new Label();
mv.visitLabel(l1);
mv.visitLineNumber(12, l1);
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitFieldInsn(Opcodes.PUTFIELD, className, "dummyProxy", "L" + fieldName + ";");
Label l2 = new Label();
mv.visitLabel(l2);
mv.visitLineNumber(13, l2);
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitVarInsn(Opcodes.ALOAD, 2);
mv.visitFieldInsn(Opcodes.PUTFIELD, className, "proxy", "L" + fieldName + ";");
Label l3 = new Label();
mv.visitLabel(l3);
mv.visitLineNumber(14, l3);
mv.visitInsn(Opcodes.RETURN);
Label l4 = new Label();
mv.visitLabel(l4);
mv.visitLocalVariable("this", "L" + className + ";", null, l0, l4, 0);
mv.visitLocalVariable("dProxy", "L" + fieldName + ";", null, l0, l4, 1);
mv.visitLocalVariable("iProxy", "L" + fieldName + ";", null, l0, l4, 2);
mv.visitMaxs(2, 3);
mv.visitEnd();
}
int lineAddition = 100;
for (Method method : interfaze.getMethods()) {
LogisticsWrapperHandler.addProxyMethod(cw, method, fieldName, className, lineAddition, !wrapperInterfacesList.contains(method.getReturnType()));
lineAddition += 10;
}
LogisticsWrapperHandler.addGetName(cw, className, proxyName);
LogisticsWrapperHandler.addGetTypeName(cw, className, "Proxy");
cw.visitEnd();
String lookfor = className.replace('/', '.');
byte[] bytes = cw.toByteArray();
if (LogisticsPipes.isDEBUG()) {
if (LogisticsWrapperHandler.DUMP) {
LogisticsWrapperHandler.saveGeneratedClass(bytes, lookfor, "LP_WRAPPER_CLASSES");
}
ClassReader cr = new ClassReader(bytes);
org.objectweb.asm.util.CheckClassAdapter.verify(cr, Launch.classLoader, false, new PrintWriter(System.err));
}
try {
clazz = LogisticsWrapperHandler.loadClass(bytes, lookfor);
} catch (LinkageError e) {
try {
if (e.getMessage().contains("attempted") && e.getMessage().contains("duplicate class definition")) {
Class<?> prev = Class.forName(className);
System.err.println(e.getMessage());
System.err.printf("Already loaded: %s%n", prev);
String resourcePath = className.replace('.', '/').concat(".class");
URL classResource = Launch.classLoader.findResource(resourcePath);
if (classResource != null) {
String path = classResource.getPath();
System.err.println("Class source: " + path);
} else {
System.err.println("Class source: Null");
}
}
} catch (Exception e2) {
e2.printStackTrace();
}
throw e;
}
LogisticsWrapperHandler.lookupMap.put(className, clazz);
}
}
T proxy = null;
Throwable e = null;
if ((ModStatusHelper.areModsLoaded(modId) || ignoreModLoaded) && proxyClazz != null) {
try {
proxy = proxyClazz.newInstance();
} catch (Exception e1) {
if (e1 instanceof VersionNotSupportedException) {
throw (VersionNotSupportedException) e1;
}
if (!(e1 instanceof DontLoadProxy)) {
e1.printStackTrace();
e = e1;
}
} catch (NoClassDefFoundError e1) {
if (!ignoreModLoaded) {
e1.printStackTrace();
e = e1;
}
}
}
T instance = (T) clazz.getConstructor(new Class<?>[] { interfaze, interfaze }).newInstance(dummyProxy, proxy);
if (proxy != null) {
LogisticsPipes.log.info("Loaded " + proxyName + "Proxy");
} else {
LogisticsPipes.log.info("Loaded " + proxyName + " DummyProxy");
if (e != null) {
((AbstractWrapper) instance).setState(WrapperState.Exception);
((AbstractWrapper) instance).setReason(e);
} else {
((AbstractWrapper) instance).setState(WrapperState.ModMissing);
}
}
((AbstractWrapper) instance).setModId(modId);
((AbstractWrapper) instance).setWrapperInterfaces(Collections.unmodifiableList(wrapperInterfacesList));
LogisticsWrapperHandler.wrapperController.add((AbstractWrapper) instance);
return instance;
}
use of org.objectweb.asm.FieldVisitor in project LogisticsPipes by RS485.
the class LogisticsClassTransformer method addAddInfoPart.
private byte[] addAddInfoPart(byte[] bytes, String className) {
final ClassReader reader = new ClassReader(bytes);
final ClassNode node = new ClassNode();
reader.accept(node, 0);
node.interfaces.add("logisticspipes/asm/addinfo/IAddInfoProvider");
{
FieldVisitor fv = node.visitField(Opcodes.ACC_PRIVATE, "logisticsPipesAdditionalInformation", "Ljava/util/ArrayList;", "Ljava/util/ArrayList<Llogisticspipes/asm/addinfo/IAddInfo;>;", null);
fv.visitEnd();
}
MethodVisitor mv;
{
mv = node.visitMethod(Opcodes.ACC_PUBLIC, "getLogisticsPipesAddInfo", "(Ljava/lang/Class;)Llogisticspipes/asm/addinfo/IAddInfo;", "<T::Llogisticspipes/asm/addinfo/IAddInfo;>(Ljava/lang/Class<TT;>;)TT;", null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(11, l0);
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitFieldInsn(Opcodes.GETFIELD, className, "logisticsPipesAdditionalInformation", "Ljava/util/ArrayList;");
Label l1 = new Label();
mv.visitJumpInsn(Opcodes.IFNONNULL, l1);
Label l2 = new Label();
mv.visitLabel(l2);
mv.visitLineNumber(12, l2);
mv.visitInsn(Opcodes.ACONST_NULL);
mv.visitInsn(Opcodes.ARETURN);
mv.visitLabel(l1);
mv.visitLineNumber(14, l1);
mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitFieldInsn(Opcodes.GETFIELD, className, "logisticsPipesAdditionalInformation", "Ljava/util/ArrayList;");
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/ArrayList", "iterator", "()Ljava/util/Iterator;", false);
mv.visitVarInsn(Opcodes.ASTORE, 2);
Label l3 = new Label();
mv.visitLabel(l3);
mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { "java/util/Iterator" }, 0, null);
mv.visitVarInsn(Opcodes.ALOAD, 2);
mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z", true);
Label l4 = new Label();
mv.visitJumpInsn(Opcodes.IFEQ, l4);
mv.visitVarInsn(Opcodes.ALOAD, 2);
mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;", true);
mv.visitTypeInsn(Opcodes.CHECKCAST, "logisticspipes/asm/addinfo/IAddInfo");
mv.visitVarInsn(Opcodes.ASTORE, 3);
Label l5 = new Label();
mv.visitLabel(l5);
mv.visitLineNumber(15, l5);
mv.visitVarInsn(Opcodes.ALOAD, 3);
Label l6 = new Label();
mv.visitJumpInsn(Opcodes.IFNONNULL, l6);
mv.visitJumpInsn(Opcodes.GOTO, l3);
mv.visitLabel(l6);
mv.visitLineNumber(16, l6);
mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { "logisticspipes/asm/addinfo/IAddInfo" }, 0, null);
mv.visitVarInsn(Opcodes.ALOAD, 3);
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
mv.visitVarInsn(Opcodes.ALOAD, 1);
Label l7 = new Label();
mv.visitJumpInsn(Opcodes.IF_ACMPNE, l7);
Label l8 = new Label();
mv.visitLabel(l8);
mv.visitLineNumber(17, l8);
mv.visitVarInsn(Opcodes.ALOAD, 3);
mv.visitInsn(Opcodes.ARETURN);
mv.visitLabel(l7);
mv.visitLineNumber(19, l7);
mv.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
mv.visitJumpInsn(Opcodes.GOTO, l3);
mv.visitLabel(l4);
mv.visitLineNumber(20, l4);
mv.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
mv.visitInsn(Opcodes.ACONST_NULL);
mv.visitInsn(Opcodes.ARETURN);
Label l9 = new Label();
mv.visitLabel(l9);
mv.visitLocalVariable("info", "Llogisticspipes/asm/addinfo/IAddInfo;", null, l5, l7, 3);
mv.visitLocalVariable("this", "L" + className + ";", null, l0, l9, 0);
mv.visitLocalVariable("clazz", "Ljava/lang/Class;", "Ljava/lang/Class<TT;>;", l0, l9, 1);
mv.visitMaxs(2, 4);
mv.visitEnd();
}
{
mv = node.visitMethod(Opcodes.ACC_PUBLIC, "setLogisticsPipesAddInfo", "(Llogisticspipes/asm/addinfo/IAddInfo;)V", null, null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(25, l0);
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitFieldInsn(Opcodes.GETFIELD, className, "logisticsPipesAdditionalInformation", "Ljava/util/ArrayList;");
Label l1 = new Label();
mv.visitJumpInsn(Opcodes.IFNONNULL, l1);
Label l2 = new Label();
mv.visitLabel(l2);
mv.visitLineNumber(26, l2);
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitTypeInsn(Opcodes.NEW, "java/util/ArrayList");
mv.visitInsn(Opcodes.DUP);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V", false);
mv.visitFieldInsn(Opcodes.PUTFIELD, className, "logisticsPipesAdditionalInformation", "Ljava/util/ArrayList;");
mv.visitLabel(l1);
mv.visitLineNumber(28, l1);
mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
mv.visitInsn(Opcodes.ICONST_0);
mv.visitVarInsn(Opcodes.ISTORE, 2);
Label l3 = new Label();
mv.visitLabel(l3);
mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { Opcodes.INTEGER }, 0, null);
mv.visitVarInsn(Opcodes.ILOAD, 2);
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitFieldInsn(Opcodes.GETFIELD, className, "logisticsPipesAdditionalInformation", "Ljava/util/ArrayList;");
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/ArrayList", "size", "()I", false);
Label l4 = new Label();
mv.visitJumpInsn(Opcodes.IF_ICMPGE, l4);
Label l5 = new Label();
mv.visitLabel(l5);
mv.visitLineNumber(29, l5);
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitFieldInsn(Opcodes.GETFIELD, className, "logisticsPipesAdditionalInformation", "Ljava/util/ArrayList;");
mv.visitVarInsn(Opcodes.ILOAD, 2);
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/ArrayList", "get", "(I)Ljava/lang/Object;", false);
Label l6 = new Label();
mv.visitJumpInsn(Opcodes.IFNONNULL, l6);
Label l7 = new Label();
mv.visitJumpInsn(Opcodes.GOTO, l7);
mv.visitLabel(l6);
mv.visitLineNumber(30, l6);
mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitFieldInsn(Opcodes.GETFIELD, className, "logisticsPipesAdditionalInformation", "Ljava/util/ArrayList;");
mv.visitVarInsn(Opcodes.ILOAD, 2);
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/ArrayList", "get", "(I)Ljava/lang/Object;", false);
mv.visitTypeInsn(Opcodes.CHECKCAST, "logisticspipes/asm/addinfo/IAddInfo");
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
mv.visitJumpInsn(Opcodes.IF_ACMPNE, l7);
Label l8 = new Label();
mv.visitLabel(l8);
mv.visitLineNumber(31, l8);
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitFieldInsn(Opcodes.GETFIELD, className, "logisticsPipesAdditionalInformation", "Ljava/util/ArrayList;");
mv.visitVarInsn(Opcodes.ILOAD, 2);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/ArrayList", "set", "(ILjava/lang/Object;)Ljava/lang/Object;", false);
mv.visitInsn(Opcodes.POP);
Label l9 = new Label();
mv.visitLabel(l9);
mv.visitLineNumber(32, l9);
mv.visitInsn(Opcodes.RETURN);
mv.visitLabel(l7);
mv.visitLineNumber(28, l7);
mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
mv.visitIincInsn(2, 1);
mv.visitJumpInsn(Opcodes.GOTO, l3);
mv.visitLabel(l4);
mv.visitLineNumber(35, l4);
mv.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitFieldInsn(Opcodes.GETFIELD, className, "logisticsPipesAdditionalInformation", "Ljava/util/ArrayList;");
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/ArrayList", "add", "(Ljava/lang/Object;)Z", false);
mv.visitInsn(Opcodes.POP);
Label l10 = new Label();
mv.visitLabel(l10);
mv.visitLineNumber(36, l10);
mv.visitInsn(Opcodes.RETURN);
Label l11 = new Label();
mv.visitLabel(l11);
mv.visitLocalVariable("i", "I", null, l3, l4, 2);
mv.visitLocalVariable("this", "L" + className + ";", null, l0, l11, 0);
mv.visitLocalVariable("info", "Llogisticspipes/asm/addinfo/IAddInfo;", null, l0, l11, 1);
mv.visitMaxs(3, 3);
mv.visitEnd();
}
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
node.accept(writer);
return writer.toByteArray();
}
use of org.objectweb.asm.FieldVisitor in project atlas by alibaba.
the class AsmFieldEditor method rewriteBytes.
private static byte[] rewriteBytes(List<Field> fields, ClassReader cr) {
ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS);
ModifyClassVisiter modifyClassVisiter = new ModifyClassVisiter(Opcodes.ASM5, cw);
for (Field field : fields) {
modifyClassVisiter.addRemoveField(field.name);
}
cr.accept(modifyClassVisiter, Opcodes.ASM5);
for (Field field : fields) {
FieldVisitor fv = cw.visitField(field.flag, field.name, Type.getDescriptor(field.value.getClass()), null, field.value);
fv.visitEnd();
}
return cw.toByteArray();
}
Aggregations