@Override protected void createSerialisation(ClassWriter cw, String proxyClassFileName, Class<?> classToProxy, String classFileName) { String[] exceptionTypeNames = {Type.getType(ObjectStreamException.class).getInternalName()}; MethodVisitor mv = cw.visitMethod(Modifier.PUBLIC, "writeReplace", "()Ljava/lang/Object;", null, exceptionTypeNames); // fill method body mv.visitCode(); // load the contextual instance Provider mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(Opcodes.GETFIELD, proxyClassFileName, FIELD_INTERCEPTOR_HANDLER, Type.getDescriptor(InterceptorHandler.class)); mv.visitInsn(Opcodes.ARETURN); mv.visitMaxs(-1, -1); mv.visitEnd(); }
private void pushIntOntoStack(final MethodVisitor mv, final int i) { if (i == 0) { mv.visitInsn(ICONST_0); } else if (i == 1) { mv.visitInsn(ICONST_1); } else if (i == 2) { mv.visitInsn(ICONST_2); } else if (i == 3) { mv.visitInsn(ICONST_3); } else if (i == 4) { mv.visitInsn(ICONST_4); } else if (i == 5) { mv.visitInsn(ICONST_5); } else if (i > 5 && i <= 255) { mv.visitIntInsn(BIPUSH, i); } else { mv.visitIntInsn(SIPUSH, i); } }
private void createSerialisation(final ClassWriter cw, final String pluginId, final String key) { final MethodVisitor mv = cw .visitMethod(Modifier.PUBLIC, "writeReplace", "()Ljava/lang/Object;", null, new String[] { Type.getType(ObjectStreamException.class).getInternalName() }); mv.visitCode(); mv.visitTypeInsn(NEW, "org/talend/sdk/component/runtime/serialization/SerializableService"); mv.visitInsn(DUP); mv.visitLdcInsn(pluginId); mv.visitLdcInsn(key); mv .visitMethodInsn(INVOKESPECIAL, "org/talend/sdk/component/runtime/serialization/SerializableService", "<init>", "(Ljava/lang/String;Ljava/lang/String;)V", false); mv.visitInsn(ARETURN); mv.visitMaxs(-1, -1); mv.visitEnd(); }
mv.visitCode(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/reflect/InvocationTargetException"); mv.visitLabel(l0); String classNameToOverride = method.getDeclaringClass().getName().replace('.', '/'); mv.visitLdcInsn(Type.getType("L" + classNameToOverride + ";")); mv.visitLdcInsn(method.getName()); mv.visitInsn(Opcodes.DUP); mv.visitFieldInsn(Opcodes.GETSTATIC, wrapperType, "TYPE", "Ljava/lang/Class;"); mv.visitLdcInsn(Type.getType(parameterType)); mv.visitInsn(Opcodes.AASTORE); mv.visitLabel(l4); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(Opcodes.GETFIELD, proxyClassFileName, FIELD_INTERCEPTOR_HANDLER, Type.getDescriptor(InterceptorHandler.class)); mv.visitFieldInsn(Opcodes.GETSTATIC, proxyClassFileName, FIELD_INTERCEPTED_METHODS, Type.getDescriptor(Method[].class)); mv.visitIntInsn(Opcodes.BIPUSH, methodIndex); mv.visitIntInsn(Opcodes.SIPUSH, methodIndex);
mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(Opcodes.GETSTATIC, proxyClassFileName, FIELD_PROTECTED_METHODS, Type.getDescriptor(Method[].class)); mv.visitIntInsn(Opcodes.BIPUSH, methodIndex); mv.visitInsn(Opcodes.AALOAD); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(Opcodes.GETFIELD, proxyClassFileName, FIELD_INSTANCE_PROVIDER, Type.getDescriptor(Provider.class)); mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, Type.getInternalName(Provider.class), "get", "()Ljava/lang/Object;", true); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(NormalScopeProxyFactory.class), "delegateProtectedMethod", "(Ljava/lang/reflect/Method;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;", false); mv.visitTypeInsn(Opcodes.CHECKCAST, getCastType(returnType)); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, getWrapperType(returnType), getPrimitiveMethod(returnType), "()" + Type.getDescriptor(returnType), false); mv.visitInsn(getReturnInsn(returnType)); mv.visitMaxs(0, 0); mv.visitEnd();
mv.visitInsn(DUP); mv.visitVarInsn(getVarInsn(parameterType), index); .visitMethodInsn(INVOKESTATIC, wrapperType, "valueOf", "(" + Type.getDescriptor(parameterType) + ")L" + wrapperType + ";", false); mv.visitInsn(AASTORE); mv.visitVarInsn(ALOAD, index); mv.visitInsn(AASTORE); index++;
protected void generateReturn(MethodVisitor mv, Method delegatedMethod) { Class<?> returnType = delegatedMethod.getReturnType(); mv.visitInsn(getReturnInsn(returnType)); }
mv.visitCode(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/reflect/InvocationTargetException"); mv.visitLabel(l0); final String classNameToOverride = method.getDeclaringClass().getName().replace('.', '/'); mv.visitLdcInsn(Type.getType("L" + classNameToOverride + ";")); mv.visitLdcInsn(method.getName()); mv.visitInsn(DUP); mv.visitFieldInsn(GETSTATIC, wrapperType, "TYPE", "Ljava/lang/Class;"); } else { mv.visitLdcInsn(Type.getType(parameterType)); mv.visitInsn(AASTORE); mv.visitLabel(l4); mv.visitVarInsn(ALOAD, 0); .visitFieldInsn(GETFIELD, proxyClassFileName, FIELD_INTERCEPTOR_HANDLER, Type.getDescriptor(InterceptorHandler.class)); mv.visitFieldInsn(GETSTATIC, proxyClassFileName, FIELD_INTERCEPTED_METHODS, Type.getDescriptor(Method[].class)); mv.visitIntInsn(BIPUSH, methodIndex); } else if (methodIndex < 32267) {
mv.visitInsn(Opcodes.DUP); mv.visitVarInsn(getVarInsn(parameterType), index); mv.visitMethodInsn(Opcodes.INVOKESTATIC, wrapperType, "valueOf", "(" + Type.getDescriptor(parameterType) + ")L" + wrapperType + ";", false); mv.visitInsn(Opcodes.AASTORE); mv.visitVarInsn(Opcodes.ALOAD, index); mv.visitInsn(Opcodes.AASTORE); index++;
@Override protected void createSerialisation(ClassWriter cw, String proxyClassFileName, Class<?> classToProxy, String classFileName) { String[] exceptionTypeNames = {Type.getType(ObjectStreamException.class).getInternalName()}; MethodVisitor mv = cw.visitMethod(Modifier.PUBLIC, "writeReplace", "()Ljava/lang/Object;", null, exceptionTypeNames); // fill method body mv.visitCode(); // load the contextual instance Provider mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(Opcodes.GETFIELD, proxyClassFileName, FIELD_INSTANCE_PROVIDER, Type.getDescriptor(Provider.class)); mv.visitInsn(Opcodes.ARETURN); mv.visitMaxs(-1, -1); mv.visitEnd(); }
mv.visitInsn(Opcodes.ICONST_0); mv.visitInsn(Opcodes.ICONST_1); mv.visitInsn(Opcodes.ICONST_2); mv.visitInsn(Opcodes.ICONST_3); mv.visitInsn(Opcodes.ICONST_4); mv.visitInsn(Opcodes.ICONST_5); mv.visitIntInsn(Opcodes.BIPUSH, i); mv.visitIntInsn(Opcodes.SIPUSH, i);
mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, parentClassFileName, "<init>", descriptor, false); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitInsn(Opcodes.ACONST_NULL); mv.visitFieldInsn(Opcodes.PUTFIELD, proxyClassFileName, FIELD_PROXIED_INSTANCE, Type.getDescriptor(classToProxy)); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitInsn(Opcodes.ACONST_NULL); mv.visitFieldInsn(Opcodes.PUTFIELD, proxyClassFileName, FIELD_INTERCEPTOR_HANDLER, Type.getDescriptor(InterceptorHandler.class)); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(-1, -1); mv.visitEnd();
mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, parentClassFileName, "<init>", descriptor, false); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitInsn(Opcodes.ACONST_NULL); mv.visitFieldInsn(Opcodes.PUTFIELD, proxyClassFileName, FIELD_INSTANCE_PROVIDER, Type.getDescriptor(Provider.class)); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(-1, -1); mv.visitEnd();
mv.visitCode(); mv.visitVarInsn(ALOAD, 0); if (constructor != null) { for (int i = 1; i <= constructor.getParameterTypes().length; i++) { mv.visitVarInsn(ALOAD, i); mv.visitMethodInsn(INVOKESPECIAL, parentClassFileName, "<init>", descriptor, false); mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ACONST_NULL); mv .visitFieldInsn(PUTFIELD, proxyClassFileName, FIELD_INTERCEPTOR_HANDLER, Type.getDescriptor(InterceptorHandler.class)); mv.visitInsn(RETURN); mv.visitMaxs(-1, -1); mv.visitEnd();
mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); if (constructor != null) mv.visitVarInsn(Opcodes.ALOAD, i); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, parentClassFileName, "<init>", descriptor, false); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(-1, -1); mv.visitEnd();
mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(Opcodes.GETFIELD, proxyClassFileName, FIELD_INSTANCE_PROVIDER, Type.getDescriptor(Provider.class)); mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, Type.getInternalName(Provider.class), "get", "()Ljava/lang/Object;", true); mv.visitTypeInsn(Opcodes.CHECKCAST, Type.getInternalName(classToProxy)); mv.visitVarInsn(type.getOpcode(Opcodes.ILOAD), offset); offset += type.getSize(); mv.visitMethodInsn(interfaceMethod ? Opcodes.INVOKEINTERFACE : Opcodes.INVOKEVIRTUAL, declaringClass.getInternalName(), delegatedMethod.getName(), methodDescriptor, interfaceMethod); mv.visitMaxs(-1, -1); mv.visitEnd();
mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(Opcodes.GETFIELD, proxyClassFileName, FIELD_PROXIED_INSTANCE, Type.getDescriptor(classToProxy)); mv.visitVarInsn(type.getOpcode(Opcodes.ILOAD), offset); offset += type.getSize(); mv.visitMethodInsn( isItf ? Opcodes.INVOKEINTERFACE : Opcodes.INVOKEVIRTUAL, declaringClass.getInternalName(), delegatedMethod.getName(), methodDescriptor, isItf); mv.visitMaxs(-1, -1); mv.visitEnd();
mv.visitCode(); mv.visitVarInsn(type.getOpcode(Opcodes.ILOAD), offset); offset += type.getSize(); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, declaringClass.getInternalName(), delegatedMethod.getName(), methodDescriptor, false); mv.visitMaxs(-1, -1); mv.visitEnd();