List of usage examples for org.objectweb.asm MethodVisitor visitTryCatchBlock
public void visitTryCatchBlock(final Label start, final Label end, final Label handler, final String type)
From source file:org.fabric3.implementation.bytecode.proxy.common.ProxyFactoryImpl.java
License:Open Source License
public <T, D extends ProxyDispatcher> T createProxy(URI classLoaderKey, Class<T> type, Method[] methods, Class<D> dispatcherInt, Class<? extends D> dispatcherTmpl, boolean wrapped) throws ProxyException { String className = type.getName() + "_Proxy_" + dispatcherInt.getSimpleName(); // ensure multiple dispatchers can be defined for the same interface // check if the proxy class has already been created BytecodeClassLoader generationLoader = getClassLoader(classLoaderKey); try {//from w w w. j a v a 2 s . c om Class<T> proxyClass = (Class<T>) generationLoader.loadClass(className); return proxyClass.newInstance(); } catch (ClassNotFoundException e) { // ignore } catch (InstantiationException e) { throw new ProxyException(e); } catch (IllegalAccessException e) { throw new ProxyException(e); } verifyTemplate(dispatcherTmpl); String classNameInternal = Type.getInternalName(type) + "_Proxy_" + dispatcherInt.getSimpleName(); String thisDescriptor = "L" + classNameInternal + ";"; String dispatcherIntName = Type.getInternalName(dispatcherInt); //Important to use class version of template class that will be copied. If class compiled with JDK 1.5 but copied //to class version 1.7 there will be errors since 1.7 enforces frame stackmaps which were not present in 1.5 int version = getClassVersion(generationLoader, dispatcherTmpl); ClassWriter cw = new ClassWriter(0); MethodVisitor mv; if (type.isInterface()) { String interfazeName = Type.getInternalName(type); cw.visit(version, ACC_PUBLIC + ACC_SUPER, classNameInternal, null, "java/lang/Object", new String[] { dispatcherIntName, interfazeName }); cw.visitSource(type.getName() + "Proxy.java", null); String baseName = Type.getInternalName(Object.class); // write the ctor writeConstructor(baseName, thisDescriptor, cw); } else { verifyBaseClass(type, methods); String baseTypeName = Type.getInternalName(type); cw.visit(version, ACC_PUBLIC + ACC_SUPER, classNameInternal, null, baseTypeName, new String[] { dispatcherIntName }); cw.visitSource(type.getName() + "Proxy.java", null); String baseName = Type.getInternalName(type); // write the ctor writeConstructor(baseName, thisDescriptor, cw); } copyTemplate(generationLoader, classNameInternal, dispatcherTmpl, cw); // write the methods int methodIndex = 0; for (Method method : methods) { //if the method is not overridable do not generate a bytecode method for it. This means any invocation of the class will directly act upon the //the base class or proxy class but since these methods should not be visible anyway it shouldn't matter. The exception could be equals/hashcode/toString/clone if (!isOverridableMethod(method)) { methodIndex++; continue; } String methodSignature = Type.getMethodDescriptor(method); String[] exceptions = new String[method.getExceptionTypes().length]; for (int i = 0; i < exceptions.length; i++) { exceptions[i] = Type.getInternalName(method.getExceptionTypes()[i]); } int visibility = Modifier.isPublic(method.getModifiers()) ? ACC_PUBLIC : Modifier.isProtected(method.getModifiers()) ? ACC_PROTECTED : 0; mv = cw.visitMethod(visibility, method.getName(), methodSignature, null, exceptions); mv.visitCode(); List<Label> exceptionLabels = new ArrayList<Label>(); Label label2 = new Label(); Label label3 = new Label(); for (String exception : exceptions) { Label endLabel = new Label(); exceptionLabels.add(endLabel); mv.visitTryCatchBlock(label2, label3, endLabel, exception); } mv.visitLabel(label2); mv.visitVarInsn(ALOAD, 0); // set the method index used to dispatch on if (methodIndex >= 0 && methodIndex <= 5) { // use an integer constant if within range mv.visitInsn(Opcodes.ICONST_0 + methodIndex); } else { mv.visitIntInsn(Opcodes.BIPUSH, methodIndex); } methodIndex++; int[] index = new int[1]; index[0] = 0; int[] stack = new int[1]; stack[0] = 1; if (method.getParameterTypes().length == 0) { // no params, load null mv.visitInsn(Opcodes.ACONST_NULL); } else { if (wrapped) { emitWrappedParameters(method, mv, index, stack); } else { emitUnWrappedParameters(method, mv, index, stack); } } mv.visitMethodInsn(INVOKEVIRTUAL, classNameInternal, "_f3_invoke", "(ILjava/lang/Object;)Ljava/lang/Object;"); // handle return values writeReturn(method, label3, mv); // implement catch blocks index[0] = 0; for (String exception : exceptions) { Label endLabel = exceptionLabels.get(index[0]); mv.visitLabel(endLabel); mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { exception }); mv.visitVarInsn(ASTORE, wrapped ? stack[0] : 1); Label label6 = new Label(); mv.visitLabel(label6); mv.visitVarInsn(ALOAD, wrapped ? stack[0] : 1); mv.visitInsn(ATHROW); index[0]++; } Label label7 = new Label(); mv.visitLabel(label7); mv.visitMaxs(7, 5); mv.visitEnd(); } cw.visitEnd(); byte[] data = cw.toByteArray(); //ClassReader classReader = new ClassReader(data); //classReader.accept(new org.objectweb.asm.util.TraceClassVisitor(null, new org.objectweb.asm.util.ASMifier(), new java.io.PrintWriter(System.out)), 0); Class<?> proxyClass = generationLoader.defineClass(className, data); try { return (T) proxyClass.newInstance(); } catch (InstantiationException e) { throw new ProxyException(e); } catch (IllegalAccessException e) { throw new ProxyException(e); } }
From source file:org.fabric3.monitor.impl.proxy.BytecodeMonitorProxyService.java
License:Open Source License
/** * Implements a monitor interface method. * * @param cw the class writer * @param index the method index * @param proxyClassNameInternal the parameter signature * @param writeParametersSignature the parameter types *//* www .j a v a 2s.co m*/ private void generateMethod(ClassWriter cw, Method method, int index, String proxyClassNameInternal, String writeParametersSignature) { String methodSignature = Type.getMethodDescriptor(method); // calculate the position of local variables. Per the JVM spec, pos 0 is reserved for a reference to "this" Class<?>[] paramTypes = method.getParameterTypes(); int numParams = paramTypes.length; int offset = calculateParameterSpace(paramTypes); // calculate position of local variables int varIndexPosition = offset + 1; // pos of the index variable used for looking up the DispatchInfo int varCurrentLevelPosition = varIndexPosition + 1; int varCurrentMessagePosition = varCurrentLevelPosition + 1; int varTimestampPosition = varCurrentMessagePosition + 1; int varDispatchInfoPosition = varCurrentMessagePosition + 1; // Note this is the same as varTimestampPos since there is an if int varEntryPosition = varTimestampPosition + 2; // Note +2 int varArgsPosition = varTimestampPosition + 2; // Note +2 and the same as varEntryPosition since there is an if int varStartPosition = varEntryPosition + 1; int varBufferPosition = varStartPosition + 2; MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, method.getName(), methodSignature, null, null); mv.visitCode(); Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, null); Label l3 = new Label(); mv.visitTryCatchBlock(l2, l3, l2, null); Label l4 = new Label(); mv.visitLabel(l4); mv.visitLineNumber(62, l4); // set the index var used to lookup the DispatchInfo. The array of DispatchInfo objects correspond to the ordering of Methods in the proxy interface. pushInteger(index, mv); mv.visitVarInsn(ISTORE, varIndexPosition); Label l5 = new Label(); mv.visitLabel(l5); mv.visitLineNumber(65, l5); // lookup the DispatchInfo based on the index for the method mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ABSTRACT_MONITOR_HANDLER, "infos", "[L" + DISPATCH_INFO + ";"); mv.visitVarInsn(ILOAD, varIndexPosition); mv.visitInsn(AALOAD); mv.visitVarInsn(ASTORE, varDispatchInfoPosition); Label l11 = new Label(); mv.visitLabel(l11); mv.visitLineNumber(70, l11); mv.visitVarInsn(ALOAD, varDispatchInfoPosition); mv.visitMethodInsn(INVOKEVIRTUAL, DISPATCH_INFO, "getLevel", "()L" + MONITOR_LEVEL + ";"); mv.visitVarInsn(ASTORE, varCurrentLevelPosition); Label l12 = new Label(); mv.visitLabel(l12); mv.visitLineNumber(71, l12); mv.visitVarInsn(ALOAD, varDispatchInfoPosition); mv.visitMethodInsn(INVOKEVIRTUAL, DISPATCH_INFO, "getMessage", "()Ljava/lang/String;"); mv.visitVarInsn(ASTORE, varCurrentMessagePosition); mv.visitVarInsn(ALOAD, varCurrentLevelPosition); Label l13 = new Label(); mv.visitJumpInsn(IFNULL, l13); mv.visitVarInsn(ALOAD, varCurrentLevelPosition); mv.visitMethodInsn(INVOKEVIRTUAL, MONITOR_LEVEL, "intValue", "()I"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ABSTRACT_MONITOR_HANDLER, "monitorable", "Lorg/fabric3/api/host/monitor/Monitorable;"); mv.visitMethodInsn(INVOKEINTERFACE, "org/fabric3/api/host/monitor/Monitorable", "getLevel", "()L" + MONITOR_LEVEL + ";"); mv.visitMethodInsn(INVOKEVIRTUAL, MONITOR_LEVEL, "intValue", "()I"); Label l14 = new Label(); mv.visitJumpInsn(IF_ICMPGE, l14); mv.visitLabel(l13); mv.visitLineNumber(75, l13); mv.visitInsn(RETURN); mv.visitLabel(l14); mv.visitLineNumber(77, l14); mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "currentTimeMillis", "()J"); mv.visitVarInsn(LSTORE, varTimestampPosition); Label l15 = new Label(); mv.visitLabel(l15); mv.visitLineNumber(78, l15); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ABSTRACT_MONITOR_HANDLER, "asyncEnabled", "Z"); Label l16 = new Label(); mv.visitJumpInsn(IFEQ, l16); Label l17 = new Label(); mv.visitLabel(l17); mv.visitLineNumber(79, l17); mv.visitInsn(ACONST_NULL); mv.visitVarInsn(ASTORE, varArgsPosition); mv.visitLabel(l0); mv.visitLineNumber(81, l0); mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "nanoTime", "()J"); mv.visitVarInsn(LSTORE, varStartPosition); Label l18 = new Label(); mv.visitLabel(l18); mv.visitLineNumber(82, l18); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ABSTRACT_MONITOR_HANDLER, "router", "L" + DESTINATION_ROUTER + ";"); mv.visitMethodInsn(INVOKEINTERFACE, DESTINATION_ROUTER, "get", "()L" + MONITOR_EVENT_ENTRY + ";"); mv.visitVarInsn(ASTORE, varEntryPosition); Label l19 = new Label(); mv.visitLabel(l19); mv.visitLineNumber(83, l19); mv.visitVarInsn(ALOAD, varEntryPosition); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ABSTRACT_MONITOR_HANDLER, "destinationIndex", "I"); mv.visitMethodInsn(INVOKEVIRTUAL, MONITOR_EVENT_ENTRY, "setDestinationIndex", "(I)V"); Label l20 = new Label(); mv.visitLabel(l20); mv.visitLineNumber(84, l20); mv.visitVarInsn(ALOAD, varEntryPosition); mv.visitVarInsn(LLOAD, varStartPosition); mv.visitMethodInsn(INVOKEVIRTUAL, MONITOR_EVENT_ENTRY, "setTimestampNanos", "(J)V"); Label l21 = new Label(); mv.visitLabel(l21); mv.visitLineNumber(85, l21); mv.visitVarInsn(ALOAD, varEntryPosition); mv.visitMethodInsn(INVOKEVIRTUAL, MONITOR_EVENT_ENTRY, "getBuffer", "()Lorg/fabric3/monitor/spi/buffer/ResizableByteBuffer;"); mv.visitVarInsn(ASTORE, varBufferPosition); mv.visitVarInsn(ALOAD, varEntryPosition); mv.visitVarInsn(ALOAD, varCurrentMessagePosition); mv.visitMethodInsn(INVOKEVIRTUAL, MONITOR_EVENT_ENTRY, "setTemplate", "(Ljava/lang/String;)V"); mv.visitVarInsn(ALOAD, varEntryPosition); mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "currentTimeMillis", "()J"); mv.visitMethodInsn(INVOKEVIRTUAL, MONITOR_EVENT_ENTRY, "setEntryTimestamp", "(J)V"); mv.visitVarInsn(ALOAD, varEntryPosition); mv.visitVarInsn(ALOAD, varCurrentLevelPosition); mv.visitMethodInsn(INVOKEVIRTUAL, MONITOR_EVENT_ENTRY, "setLevel", "(L" + MONITOR_LEVEL + ";)V"); Label l22 = new Label(); mv.visitLabel(l22); mv.visitLineNumber(87, l22); mv.visitVarInsn(ALOAD, 0); // Load the method arguments onto the stack. Note that we access the method arguments using i+1 since the 0 position is used by "this" (params begin // at 1). for (int i = 0; i < paramTypes.length; i++) { Class<?> paramType = paramTypes[i]; if (paramType.isPrimitive()) { if (Integer.TYPE.equals(paramType)) { mv.visitVarInsn(ILOAD, i + 1); } else if (Long.TYPE.equals(paramType)) { mv.visitVarInsn(LLOAD, i + 1); } else if (Double.TYPE.equals(paramType)) { mv.visitVarInsn(DLOAD, i + 1); } else if (Boolean.TYPE.equals(paramType)) { mv.visitVarInsn(ILOAD, i + 1); } else if (Float.TYPE.equals(paramType)) { mv.visitVarInsn(FLOAD, i + 1); } else if (Short.TYPE.equals(paramType)) { mv.visitVarInsn(ILOAD, i + 1); } else if (Byte.TYPE.equals(paramType)) { mv.visitVarInsn(ILOAD, i + 1); } else if (Character.TYPE.equals(paramType)) { mv.visitVarInsn(ILOAD, i + 1); } else { throw new AssertionError("Unhandled type: " + paramType); } } else { mv.visitVarInsn(ALOAD, i + 1); } } mv.visitVarInsn(ALOAD, varEntryPosition); mv.visitMethodInsn(INVOKESPECIAL, proxyClassNameInternal, "writeParameters" + index, writeParametersSignature); Label l24 = new Label(); mv.visitLabel(l24); mv.visitLineNumber(90, l24); mv.visitLabel(l1); mv.visitLineNumber(95, l1); mv.visitVarInsn(ALOAD, varEntryPosition); Label l27 = new Label(); mv.visitJumpInsn(IFNULL, l27); Label l28 = new Label(); mv.visitLabel(l28); mv.visitLineNumber(96, l28); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ABSTRACT_MONITOR_HANDLER, "router", "L" + DESTINATION_ROUTER + ";"); mv.visitVarInsn(ALOAD, varEntryPosition); mv.visitMethodInsn(INVOKEINTERFACE, DESTINATION_ROUTER, "publish", "(L" + MONITOR_EVENT_ENTRY + ";)V"); mv.visitJumpInsn(GOTO, l27); mv.visitLabel(l2); mv.visitLineNumber(95, l2); mv.visitVarInsn(ASTORE, 13); mv.visitLabel(l3); mv.visitVarInsn(ALOAD, varEntryPosition); Label l29 = new Label(); mv.visitJumpInsn(IFNULL, l29); Label l30 = new Label(); mv.visitLabel(l30); mv.visitLineNumber(96, l30); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ABSTRACT_MONITOR_HANDLER, "router", "L" + DESTINATION_ROUTER + ";"); mv.visitVarInsn(ALOAD, varArgsPosition); mv.visitMethodInsn(INVOKEINTERFACE, DESTINATION_ROUTER, "publish", "(L" + MONITOR_EVENT_ENTRY + ";)V"); mv.visitLabel(l29); mv.visitVarInsn(ALOAD, 13); mv.visitInsn(ATHROW); mv.visitLabel(l27); mv.visitLineNumber(99, l27); Label l31 = new Label(); mv.visitJumpInsn(GOTO, l31); mv.visitLabel(l16); mv.visitLineNumber(100, l16); pushInteger(numParams, mv); mv.visitTypeInsn(ANEWARRAY, "java/lang/Object"); mv.visitVarInsn(ASTORE, varArgsPosition); Label l32 = new Label(); mv.visitLabel(l32); mv.visitLineNumber(101, l32); for (int i = 0; i < paramTypes.length; i++) { mv.visitVarInsn(ALOAD, varArgsPosition); pushInteger(i, mv); if (paramTypes[i].isPrimitive()) { // i+1 since that is the position of the method argument (position 0 is reserved for "this") if (Integer.TYPE.equals(paramTypes[i])) { mv.visitVarInsn(ILOAD, i + 1); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;"); } else if (Long.TYPE.equals(paramTypes[i])) { mv.visitVarInsn(LLOAD, i + 1); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;"); } else if (Double.TYPE.equals(paramTypes[i])) { mv.visitVarInsn(DLOAD, i + 1); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;"); } else if (Float.TYPE.equals(paramTypes[i])) { mv.visitVarInsn(FLOAD, i + 1); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Float", "valueOf", "(F)Ljava/lang/Float;"); } else if (Boolean.TYPE.equals(paramTypes[i])) { mv.visitVarInsn(ILOAD, i + 1); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(Z)Ljava/lang/Boolean;"); } else if (Short.TYPE.equals(paramTypes[i])) { mv.visitVarInsn(ILOAD, i + 1); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Short", "valueOf", "(S)Ljava/lang/Short;"); } else if (Byte.TYPE.equals(paramTypes[i])) { mv.visitVarInsn(ILOAD, i + 1); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Byte", "valueOf", "(B)Ljava/lang/Byte;"); } else if (Character.TYPE.equals(paramTypes[i])) { mv.visitVarInsn(ILOAD, i + 1); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Character", "valueOf", "(C)Ljava/lang/Character;"); } } else { mv.visitVarInsn(ALOAD, i + 1); // i+1 since that is the position of the method argument (position 0 is reserved for "this") } mv.visitInsn(AASTORE); } Label l34 = new Label(); mv.visitLabel(l34); mv.visitLineNumber(103, l34); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ABSTRACT_MONITOR_HANDLER, "router", "L" + DESTINATION_ROUTER + ";"); mv.visitVarInsn(ALOAD, varCurrentLevelPosition); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ABSTRACT_MONITOR_HANDLER, "destinationIndex", "I"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ABSTRACT_MONITOR_HANDLER, "runtimeName", "Ljava/lang/String;"); mv.visitVarInsn(LLOAD, varTimestampPosition); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ABSTRACT_MONITOR_HANDLER, "source", "Ljava/lang/String;"); mv.visitVarInsn(ALOAD, varCurrentMessagePosition); mv.visitVarInsn(ALOAD, varArgsPosition); mv.visitMethodInsn(INVOKEINTERFACE, DESTINATION_ROUTER, "send", "(Lorg/fabric3/api/annotation/monitor/MonitorLevel;ILjava/lang/String;JLjava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V"); mv.visitLabel(l31); mv.visitLineNumber(106, l31); mv.visitInsn(RETURN); Label methodEnd = new Label(); mv.visitLabel(methodEnd); mv.visitLocalVariable("this", "Lorg/fabric3/monitor/impl/proxy/AbstractMonitorHandler;", null, l4, methodEnd, 0); // Load the method params as local variables. Note the index starts at 1 since 0 is reserved for "this". for (int i = 1; i <= numParams; i++) { Class<?> paramType = paramTypes[i - 1]; if (String.class.equals(paramType)) { mv.visitLocalVariable("arg" + i, "Ljava/lang/String;", null, l4, methodEnd, i); } else if (Integer.TYPE.equals(paramType)) { mv.visitLocalVariable("arg" + i, "I", null, l4, methodEnd, i); } else if (Long.TYPE.equals(paramType)) { mv.visitLocalVariable("arg" + i, "J", null, l4, methodEnd, i); } else if (Double.TYPE.equals(paramType)) { mv.visitLocalVariable("arg" + i, "D", null, l4, methodEnd, i); } else if (Boolean.TYPE.equals(paramType)) { mv.visitLocalVariable("arg" + i, "Z", null, l4, methodEnd, i); } else if (Float.TYPE.equals(paramType)) { mv.visitLocalVariable("arg" + i, "F", null, l4, methodEnd, i); } else if (Short.TYPE.equals(paramType)) { mv.visitLocalVariable("arg" + i, "S", null, l4, methodEnd, i); } else if (Byte.TYPE.equals(paramType)) { mv.visitLocalVariable("arg" + i, "B", null, l4, methodEnd, i); } else if (Character.TYPE.equals(paramType)) { mv.visitLocalVariable("arg" + i, "C", null, l4, methodEnd, i); } else if (paramType.isPrimitive()) { throw new AssertionError("Unhandled type: " + paramType); } else { mv.visitLocalVariable("arg" + i, "Ljava/lang/Object;", null, l4, methodEnd, i); } } mv.visitLocalVariable("index", "I", null, l5, methodEnd, varIndexPosition); mv.visitLocalVariable("currentLevel", "L" + MONITOR_LEVEL + ";", null, l12, methodEnd, varCurrentLevelPosition); mv.visitLocalVariable("currentMessage", "Ljava/lang/String;", null, l12, methodEnd, varCurrentMessagePosition); mv.visitLocalVariable("timestamp", "J", null, l15, methodEnd, varTimestampPosition); mv.visitLocalVariable("info", "L" + DISPATCH_INFO + ";", null, l11, l12, varDispatchInfoPosition); mv.visitLocalVariable("entry", "L" + MONITOR_EVENT_ENTRY + ";", null, l0, l27, varEntryPosition); mv.visitLocalVariable("args", "[Ljava/lang/Object;", null, l32, l31, varArgsPosition); mv.visitLocalVariable("start", "J", null, l18, l1, varStartPosition); mv.visitLocalVariable("buffer", "Lorg/fabric3/monitor/spi/buffer/ResizableByteBuffer;", null, l22, l1, varBufferPosition); mv.visitMaxs(9, 14); mv.visitEnd(); }
From source file:org.glowroot.agent.weaving.WeavingClassVisitor.java
License:Apache License
@RequiresNonNull({ "type", "metaHolderInternalName", "loader" }) private void generateMetaHolder() throws Exception { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES); cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, metaHolderInternalName, null, "java/lang/Object", null); Type metaHolderType = Type.getObjectType(metaHolderInternalName); MethodVisitor mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null); mv.visitCode();//from w w w . ja v a 2s .c o m Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/ClassNotFoundException"); mv.visitLabel(l0); for (Type classMetaType : classMetaTypes) { String classMetaInternalName = classMetaType.getInternalName(); String classMetaFieldName = "glowroot$class$meta$" + classMetaInternalName.replace('/', '$'); FieldVisitor fv = cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC, classMetaFieldName, "L" + classMetaInternalName + ";", null, null); fv.visitEnd(); mv.visitTypeInsn(NEW, classMetaInternalName); mv.visitInsn(DUP); loadType(mv, type, metaHolderType); mv.visitMethodInsn(INVOKESPECIAL, classMetaInternalName, "<init>", "(Ljava/lang/Class;)V", false); mv.visitFieldInsn(PUTSTATIC, metaHolderInternalName, classMetaFieldName, "L" + classMetaInternalName + ";"); } for (MethodMetaGroup methodMetaGroup : methodMetaGroups) { for (Type methodMetaType : methodMetaGroup.methodMetaTypes()) { String methodMetaInternalName = methodMetaType.getInternalName(); String methodMetaFieldName = "glowroot$method$meta$" + methodMetaGroup.uniqueNum() + '$' + methodMetaInternalName.replace('/', '$'); FieldVisitor fv = cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC, methodMetaFieldName, "L" + methodMetaInternalName + ";", null, null); fv.visitEnd(); mv.visitTypeInsn(NEW, methodMetaInternalName); mv.visitInsn(DUP); loadType(mv, type, metaHolderType); mv.visitLdcInsn(methodMetaGroup.methodName()); mv.visitIntInsn(BIPUSH, methodMetaGroup.methodParameterTypes().size()); mv.visitTypeInsn(ANEWARRAY, "java/lang/Class"); for (int i = 0; i < methodMetaGroup.methodParameterTypes().size(); i++) { mv.visitInsn(DUP); mv.visitIntInsn(BIPUSH, i); loadType(mv, methodMetaGroup.methodParameterTypes().get(i), metaHolderType); mv.visitInsn(AASTORE); } mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getDeclaredMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", false); mv.visitMethodInsn(INVOKESPECIAL, methodMetaInternalName, "<init>", "(Ljava/lang/reflect/Method;)V", false); mv.visitFieldInsn(PUTSTATIC, metaHolderInternalName, methodMetaFieldName, "L" + methodMetaInternalName + ";"); } } // this is just try/catch ClassNotFoundException/re-throw AssertionError mv.visitLabel(l1); Label l3 = new Label(); mv.visitJumpInsn(GOTO, l3); mv.visitLabel(l2); mv.visitFrame(F_SAME1, 0, null, 1, new Object[] { "java/lang/ClassNotFoundException" }); mv.visitVarInsn(ASTORE, 0); mv.visitTypeInsn(NEW, "java/lang/AssertionError"); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/AssertionError", "<init>", "(Ljava/lang/Object;)V", false); mv.visitInsn(ATHROW); mv.visitLabel(l3); mv.visitFrame(F_SAME, 0, null, 0, null); mv.visitInsn(RETURN); mv.visitMaxs(0, 0); mv.visitEnd(); cw.visitEnd(); byte[] bytes = cw.toByteArray(); ClassLoaders.defineClass(ClassNames.fromInternalName(metaHolderInternalName), bytes, loader); }
From source file:org.glowroot.weaving.WeavingClassVisitor.java
License:Apache License
@RequiresNonNull({ "type", "metaHolderInternalName", "loader" }) private void generateMetaHolder() throws Exception { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES); cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, metaHolderInternalName, null, "java/lang/Object", null); Type metaHolderType = Type.getObjectType(metaHolderInternalName); MethodVisitor mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null); mv.visitCode();// w w w. j a v a 2 s. c o m Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/ClassNotFoundException"); mv.visitLabel(l0); for (Type classMetaType : classMetaTypes) { String classMetaInternalName = classMetaType.getInternalName(); String classMetaFieldName = "glowroot$class$meta$" + classMetaInternalName.replace('/', '$'); FieldVisitor fv = cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC, classMetaFieldName, "L" + classMetaInternalName + ";", null, null); fv.visitEnd(); mv.visitTypeInsn(NEW, classMetaInternalName); mv.visitInsn(DUP); loadType(mv, type, metaHolderType); mv.visitMethodInsn(INVOKESPECIAL, classMetaInternalName, "<init>", "(Ljava/lang/Class;)V", false); mv.visitFieldInsn(PUTSTATIC, metaHolderInternalName, classMetaFieldName, "L" + classMetaInternalName + ";"); } for (MethodMetaGroup methodMetaGroup : methodMetaGroups) { for (Type methodMetaType : methodMetaGroup.methodMetaTypes()) { String methodMetaInternalName = methodMetaType.getInternalName(); String methodMetaFieldName = "glowroot$method$meta$" + methodMetaGroup.uniqueNum() + '$' + methodMetaInternalName.replace('/', '$'); FieldVisitor fv = cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC, methodMetaFieldName, "L" + methodMetaInternalName + ";", null, null); fv.visitEnd(); mv.visitTypeInsn(NEW, methodMetaInternalName); mv.visitInsn(DUP); loadType(mv, type, metaHolderType); loadType(mv, methodMetaGroup.returnType(), metaHolderType); mv.visitIntInsn(BIPUSH, methodMetaGroup.parameterTypes().size()); mv.visitTypeInsn(ANEWARRAY, "java/lang/Class"); for (int i = 0; i < methodMetaGroup.parameterTypes().size(); i++) { mv.visitInsn(DUP); mv.visitIntInsn(BIPUSH, i); loadType(mv, methodMetaGroup.parameterTypes().get(i), metaHolderType); mv.visitInsn(AASTORE); } mv.visitMethodInsn(INVOKESPECIAL, methodMetaInternalName, "<init>", "(Ljava/lang/Class;Ljava/lang/Class;[Ljava/lang/Class;)V", false); mv.visitFieldInsn(PUTSTATIC, metaHolderInternalName, methodMetaFieldName, "L" + methodMetaInternalName + ";"); } } // this is just try/catch ClassNotFoundException/re-throw AssertionError mv.visitLabel(l1); Label l3 = new Label(); mv.visitJumpInsn(GOTO, l3); mv.visitLabel(l2); mv.visitFrame(F_SAME1, 0, null, 1, new Object[] { "java/lang/ClassNotFoundException" }); mv.visitVarInsn(ASTORE, 0); mv.visitTypeInsn(NEW, "java/lang/AssertionError"); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/AssertionError", "<init>", "(Ljava/lang/Object;)V", false); mv.visitInsn(ATHROW); mv.visitLabel(l3); mv.visitFrame(F_SAME, 0, null, 0, null); mv.visitInsn(RETURN); mv.visitMaxs(0, 0); mv.visitEnd(); cw.visitEnd(); byte[] bytes = cw.toByteArray(); ClassLoaders.defineClass(ClassNames.fromInternalName(metaHolderInternalName), bytes, loader); }
From source file:org.gradle.model.internal.manage.schema.extract.ManagedProxyClassGenerator.java
License:Apache License
private void writeTypeConvertingSetter(ClassVisitor visitor, Type generatedType, Class<?> viewClass, ModelProperty<?> property) { WeaklyTypeReferencingMethod<?, ?> weakSetter = property.getAccessor(SETTER); // There is no setter for this property if (weakSetter == null) { return;/* w w w .ja v a2 s.c o m*/ } if (!(property.getSchema() instanceof ScalarValueSchema)) { return; } Class<?> propertyClass = property.getType().getConcreteClass(); Type propertyType = Type.getType(propertyClass); Class<?> boxedClass = propertyClass.isPrimitive() ? BOXED_TYPES.get(propertyClass) : propertyClass; Type boxedType = Type.getType(boxedClass); Method setter = weakSetter.getMethod(); MethodVisitor methodVisitor = declareMethod(visitor, setter.getName(), SET_OBJECT_PROPERTY_DESCRIPTOR, SET_OBJECT_PROPERTY_DESCRIPTOR); putThisOnStack(methodVisitor); putTypeConverterFieldValueOnStack(methodVisitor, generatedType); // Object converted = $typeConverter.convert(foo, Float.class, false); methodVisitor.visitVarInsn(ALOAD, 1); // put var #1 ('foo') on the stack methodVisitor.visitLdcInsn(boxedType); // push the constant Class onto the stack methodVisitor.visitInsn(propertyClass.isPrimitive() ? ICONST_1 : ICONST_0); // push int 1 or 0 (interpreted as true or false) onto the stack Label startTry = new Label(); methodVisitor.visitLabel(startTry); methodVisitor.visitMethodInsn(INVOKEINTERFACE, TYPE_CONVERTER_TYPE.getInternalName(), "convert", COERCE_TO_SCALAR_DESCRIPTOR, true); Label endTry = new Label(); methodVisitor.visitLabel(endTry); methodVisitor.visitTypeInsn(CHECKCAST, boxedType.getInternalName()); if (propertyClass.isPrimitive()) { unboxType(methodVisitor, propertyClass); } // invoke the typed setter methodVisitor.visitMethodInsn(INVOKEVIRTUAL, generatedType.getInternalName(), setter.getName(), Type.getMethodDescriptor(Type.VOID_TYPE, propertyType), false); methodVisitor.visitInsn(RETURN); // catch(TypeConversionException e) { throw ... } Label startCatch = new Label(); methodVisitor.visitLabel(startCatch); methodVisitor.visitTryCatchBlock(startTry, endTry, startCatch, TYPE_CONVERSION_EXCEPTION_TYPE.getInternalName()); methodVisitor.visitVarInsn(ASTORE, 2); // store thrown exception putClassOnStack(methodVisitor, viewClass); methodVisitor.visitLdcInsn(property.getName()); putFirstMethodArgumentOnStack(methodVisitor); methodVisitor.visitVarInsn(ALOAD, 2); methodVisitor.visitMethodInsn(INVOKESTATIC, Type.getInternalName(ManagedProxyClassGenerator.class), "propertyValueConvertFailure", Type.getMethodDescriptor(Type.VOID_TYPE, CLASS_TYPE, STRING_TYPE, OBJECT_TYPE, TYPE_CONVERSION_EXCEPTION_TYPE), false); finishVisitingMethod(methodVisitor); }
From source file:org.gradle.model.internal.manage.schema.extract.ManagedProxyClassGenerator.java
License:Apache License
private void writeNonAbstractMethodWrapper(ClassVisitor visitor, Type generatedType, Class<?> managedTypeClass, Method method) {// www .java 2 s . c o m Label start = new Label(); Label end = new Label(); Label handler = new Label(); MethodVisitor methodVisitor = declareMethod(visitor, method); methodVisitor.visitTryCatchBlock(start, end, handler, null); setCanCallSettersField(methodVisitor, generatedType, false); methodVisitor.visitLabel(start); invokeSuperMethod(methodVisitor, managedTypeClass, method); methodVisitor.visitLabel(end); setCanCallSettersField(methodVisitor, generatedType, true); methodVisitor.visitInsn(ARETURN); methodVisitor.visitLabel(handler); setCanCallSettersField(methodVisitor, generatedType, true); methodVisitor.visitInsn(ATHROW); methodVisitor.visitMaxs(0, 0); methodVisitor.visitEnd(); }
From source file:org.jboss.byteman.agent.JigsawAccessEnablerGenerator.java
License:Open Source License
public static byte[] getJigsawAccessEnablerClassBytes() { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); FieldVisitor fv;//w ww. ja v a2 s . c om MethodVisitor mv; // package org/jboss/byteman/jigsaw; // public class JigsawAccessEnabler implements AccessEnabler { ... } cw.visit(V9, ACC_PUBLIC + ACC_SUPER, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", null, "java/lang/Object", new String[] { "org/jboss/byteman/agent/AccessEnabler" }); cw.visitSource("JigsawAccessEnabler.java", null); // this is here because we use String + String cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup", ACC_PUBLIC + ACC_FINAL + ACC_STATIC); { // private Module THIS_MODULE = this.getClass().getModule(); fv = cw.visitField(ACC_PRIVATE, "THIS_MODULE", "Ljava/lang/Module;", null, null); fv.visitEnd(); } { // private Module UNPRIVILEGED_MODULE = AccessEnabler.class.getModule(); fv = cw.visitField(ACC_PRIVATE, "UNPRIVILEGED_MODULE", "Ljava/lang/Module;", null, null); fv.visitEnd(); } { // private Set<Module> THIS_MODULE_SET = Set.of(THIS_MODULE); fv = cw.visitField(ACC_PRIVATE, "THIS_MODULE_SET", "Ljava/util/Set;", "Ljava/util/Set<Ljava/lang/Module;>;", null); fv.visitEnd(); } { // private Set<Module> EMPTY_READS_SET = Set.of(); fv = cw.visitField(ACC_PRIVATE, "EMPTY_READS_SET", "Ljava/util/Set;", "Ljava/util/Set<Ljava/lang/Module;>;", null); fv.visitEnd(); } { // private Map<String,<Set<Module>> EMPTY_EXPORTS_MAP = Map.of(); fv = cw.visitField(ACC_PRIVATE, "EMPTY_EXPORTS_MAP", "Ljava/util/Map;", "Ljava/util/Map<Ljava/lang/String;Ljava/util/Set<Ljava/lang/Module;>;>;", null); fv.visitEnd(); } { // private Map<String,<Set<Module>> EMPTY_OPENS_MAP = Map.of(); fv = cw.visitField(ACC_PRIVATE, "EMPTY_OPENS_MAP", "Ljava/util/Map;", "Ljava/util/Map<Ljava/lang/String;Ljava/util/Set<Ljava/lang/Module;>;>;", null); fv.visitEnd(); } { // private Set<Class<?>> EMPTY_USES_SET = Set.of() fv = cw.visitField(ACC_PRIVATE, "EMPTY_USES_SET", "Ljava/util/Set;", "Ljava/util/Set<Ljava/lang/Class<*>;>;", null); fv.visitEnd(); } { // private Map<Class<?>,List<Class?>>> EMPTY_PROVIDES_MAP = Map.of(); fv = cw.visitField(ACC_PRIVATE, "EMPTY_PROVIDES_MAP", "Ljava/util/Map;", "Ljava/util/Map<Ljava/lang/Class<*>;Ljava/util/List<Ljava/lang/Class<*>;>;>;", null); fv.visitEnd(); } { // private Instrumentation inst; fv = cw.visitField(ACC_PRIVATE, "inst", "Ljava/lang/instrument/Instrumentation;", null, null); fv.visitEnd(); } { // private Lookup theLookup; fv = cw.visitField(ACC_PRIVATE, "theLookup", "Ljava/lang/invoke/MethodHandles$Lookup;", null, null); fv.visitEnd(); } { // private DefaultAccessEnabler defaultAccessEnabler; fv = cw.visitField(ACC_PRIVATE, "defaultAccessEnabler", "Lorg/jboss/byteman/agent/DefaultAccessEnabler;", null, null); fv.visitEnd(); } { // public JigsawAccessEnabler(Instrumentation inst) { mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Ljava/lang/instrument/Instrumentation;)V", null, null); mv.visitCode(); Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception"); // super() mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); // this.THIS_MODULE = this.getClass().getModule(); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModule", "()Ljava/lang/Module;", false); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE", "Ljava/lang/Module;"); // this.UNPRIVILEGED_MODULE = AccessEnabler.class.getModule(); mv.visitVarInsn(ALOAD, 0); mv.visitLdcInsn(Type.getType("Lorg/jboss/byteman/agent/AccessEnabler;")); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModule", "()Ljava/lang/Module;", false); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "UNPRIVILEGED_MODULE", "Ljava/lang/Module;"); // this.THIS_MODULE_SET = Set.of(this.THIS_MODULE); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE", "Ljava/lang/Module;"); mv.visitMethodInsn(INVOKESTATIC, "java/util/Set", "of", "(Ljava/lang/Object;)Ljava/util/Set;", true); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE_SET", "Ljava/util/Set;"); // this.EMPTY_READS_SET = Set.of(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESTATIC, "java/util/Set", "of", "()Ljava/util/Set;", true); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_READS_SET", "Ljava/util/Set;"); // this.EMPTY_EXPORTS_MAP = Map.of(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESTATIC, "java/util/Map", "of", "()Ljava/util/Map;", true); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_EXPORTS_MAP", "Ljava/util/Map;"); // this.EMPTY_OPENS_MAP = Map.of(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESTATIC, "java/util/Map", "of", "()Ljava/util/Map;", true); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_OPENS_MAP", "Ljava/util/Map;"); // this.EMPTY_USES_SET = Set.of() mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESTATIC, "java/util/Set", "of", "()Ljava/util/Set;", true); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_USES_SET", "Ljava/util/Set;"); // this.EMPTY_PROVIDES_MAP = Map.of(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESTATIC, "java/util/Map", "of", "()Ljava/util/Map;", true); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_PROVIDES_MAP", "Ljava/util/Map;"); // if this.THIS_MODULE.isnamed() mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE", "Ljava/lang/Module;"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isNamed", "()Z", false); Label l3 = new Label(); mv.visitJumpInsn(IFNE, l3); // { // throw NEW RuntimeException("JigsawAccessEnabler : can only enable Jigsaw access from a named module not " + THIS_MODULE); mv.visitTypeInsn(NEW, "java/lang/RuntimeException"); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE", "Ljava/lang/Module;"); mv.visitInvokeDynamicInsn("makeConcatWithConstants", "(Ljava/lang/Module;)Ljava/lang/String;", new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/StringConcatFactory", "makeConcatWithConstants", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;"), new Object[] { "JigsawAccessEnabler : can only enable Jigsaw access from a named module not \u0001" }); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;)V", false); mv.visitInsn(ATHROW); // } mv.visitLabel(l3); // if (inst == null) mv.visitVarInsn(ALOAD, 1); Label l4 = new Label(); mv.visitJumpInsn(IFNONNULL, l4); // { // throw New RuntimeException("JigsawAccessEnabler : can only be created if passed a real Instrumentation handle"); mv.visitTypeInsn(NEW, "java/lang/RuntimeException"); mv.visitInsn(DUP); mv.visitLdcInsn("JigsawAccessEnabler : can only be created if passed a real Instrumentation handle"); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;)V", false); mv.visitInsn(ATHROW); // } mv.visitLabel(l4); // this.inst = inst; mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "inst", "Ljava/lang/instrument/Instrumentation;"); // try { mv.visitLabel(l0); // this.theLookup = MethodHandles.lookup(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "lookup", "()Ljava/lang/invoke/MethodHandles$Lookup;", false); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "theLookup", "Ljava/lang/invoke/MethodHandles$Lookup;"); mv.visitLabel(l1); Label l5 = new Label(); mv.visitJumpInsn(GOTO, l5); // } (catch Exception) { mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 2); // throw new RuntimeException("JigsawAccessEnabler : cannot access Lookup.IMPL_LOOKUP", e); mv.visitTypeInsn(NEW, "java/lang/RuntimeException"); mv.visitInsn(DUP); mv.visitLdcInsn("JigsawAccessEnabler : cannot obtain lookup from Byteman module"); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;Ljava/lang/Throwable;)V", false); mv.visitInsn(ATHROW); // } mv.visitLabel(l5); // defaultAccessEnabler = new DefaultAccessEnabler(); mv.visitVarInsn(ALOAD, 0); mv.visitTypeInsn(NEW, "org/jboss/byteman/agent/DefaultAccessEnabler"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/agent/DefaultAccessEnabler", "<init>", "()V", false); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "defaultAccessEnabler", "Lorg/jboss/byteman/agent/DefaultAccessEnabler;"); if (DEBUG) { // debug("created JigsawAccessEnabler") mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("created JigsawAccessEnabler"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // return mv.visitInsn(RETURN); // } mv.visitMaxs(5, 3); mv.visitEnd(); } { // public boolean requiresAccess(Class<?> klazz) mv = cw.visitMethod(ACC_PUBLIC, "requiresAccess", "(Ljava/lang/Class;)Z", "(Ljava/lang/Class<*>;)Z", null); mv.visitCode(); Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/SecurityException"); // debug("JigsawAccessEnabler.requiresAccess( klazz == " + klazz.getName() + ")"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_3); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("JigsawAccessEnabler.requiresAccess( klazz == "); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_1); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_2); mv.visitLdcInsn(")"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } Label l3 = new Label(); mv.visitLabel(l3); // while (Modifier.isPublic(klazz.getModifiers())) mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModifiers", "()I", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/reflect/Modifier", "isPublic", "(I)Z", false); Label l4 = new Label(); mv.visitJumpInsn(IFEQ, l4); // { // Module module = klazz.getModule(); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModule", "()Ljava/lang/Module;", false); mv.visitVarInsn(ASTORE, 2); // if (module.isNamed()) mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isNamed", "()Z", false); Label l5 = new Label(); mv.visitJumpInsn(IFEQ, l5); // { // debug(" module == " + module.getName()); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_2); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn(" module == "); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_1); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "getName", "()Ljava/lang/String;", false); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // Package pkg = klazz.getPackage(); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getPackage", "()Ljava/lang/Package;", false); mv.visitVarInsn(ASTORE, 3); // if (pkg == null) mv.visitVarInsn(ALOAD, 3); Label l6 = new Label(); mv.visitJumpInsn(IFNONNULL, l6); // { // debug (" (pkg == null) ==> false"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn(" (pkg == null) ==> false"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); // } mv.visitLabel(l6); // if (!module.isExported(pkg.getName())) mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Package", "getName", "()Ljava/lang/String;", false); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isExported", "(Ljava/lang/String;)Z", false); mv.visitJumpInsn(IFNE, l5); // { // debug (" !module.isExported(pkg.getName()) ==> true"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn(" !module.isExported(pkg.getName()) ==> true"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // return true; mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); // } // } mv.visitLabel(l5); // if (!klazz.isMemberClass()) mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "isMemberClass", "()Z", false); mv.visitJumpInsn(IFNE, l0); // { // debug(" !klazz.isMemberClass() ==> false") ; if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn(" !klazz.isMemberClass() ==> false"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); // } // try { mv.visitLabel(l0); // klazz = klazz.getDeclaringClass(); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getDeclaringClass", "()Ljava/lang/Class;", false); mv.visitVarInsn(ASTORE, 1); // debug(" klazz == " + klazz.getName()); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_2); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn(" klazz == "); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_1); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } mv.visitLabel(l1); Label l7 = new Label(); mv.visitJumpInsn(GOTO, l7); // } catch (SecurityException se) { mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 3); // debug ("SecurityException ==> true"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("SecurityException ==> true"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); // } mv.visitLabel(l7); // } mv.visitJumpInsn(GOTO, l3); mv.visitLabel(l4); // debug (" ==> true"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn(" ==> true"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); mv.visitMaxs(5, 4); mv.visitEnd(); } { // public boolean requiresAccess(AccessibleObject) { mv = cw.visitMethod(ACC_PUBLIC, "requiresAccess", "(Ljava/lang/reflect/AccessibleObject;)Z", null, null); mv.visitCode(); // Member member = (Member)accessible; mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, "java/lang/reflect/Member"); mv.visitVarInsn(ASTORE, 2); // debug("JigsawAccessEnabler.requiresAccess( accessible == " + member.getDeclaringClass().getName() + member.getName() + ")"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_5); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("JigsawAccessEnabler.requiresAccess( accessible == "); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_1); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/reflect/Member", "getDeclaringClass", "()Ljava/lang/Class;", true); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_2); mv.visitLdcInsn("."); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_3); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/reflect/Member", "getName", "()Ljava/lang/String;", true); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_4); mv.visitLdcInsn(")"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // if (!Modifier.isPublic(member.getModifiers()) mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/reflect/Member", "getModifiers", "()I", true); mv.visitMethodInsn(INVOKESTATIC, "java/lang/reflect/Modifier", "isPublic", "(I)Z", false); Label l0 = new Label(); mv.visitJumpInsn(IFNE, l0); // { // debug ("!Modifier.isPublic(member.getModifiers()) ==> true"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("!Modifier.isPublic(member.getModifiers()) ==> true"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // return true mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); // } mv.visitLabel(l0); // Class<?> clazz = member.getDeclaringClass(); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/reflect/Member", "getDeclaringClass", "()Ljava/lang/Class;", true); mv.visitVarInsn(ASTORE, 3); // if (!Modifier.isPublic(clazz.getModifiers())) mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModifiers", "()I", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/reflect/Modifier", "isPublic", "(I)Z", false); Label l1 = new Label(); mv.visitJumpInsn(IFNE, l1); // { // debug("!Modifier.isPublic(clazz.getModifiers()) ==> true"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("!Modifier.isPublic(clazz.getModifiers()) ==> true"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); // } mv.visitLabel(l1); // while (clazz.isMemberClass()) mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "isMemberClass", "()Z", false); Label l2 = new Label(); mv.visitJumpInsn(IFEQ, l2); // do { // clazz = clazz.getEnclosingClass(); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getEnclosingClass", "()Ljava/lang/Class;", false); mv.visitVarInsn(ASTORE, 3); // debug("klazz == " + clazz.getName()); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_2); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("klazz == "); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_1); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // if (!Modifier.isPublic(clazz.getModifiers())) mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModifiers", "()I", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/reflect/Modifier", "isPublic", "(I)Z", false); mv.visitJumpInsn(IFNE, l1); // { // debug("!Modifier.isPublic(clazz.getModifiers()) ==> true"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("!Modifier.isPublic(clazz.getModifiers()) ==> true"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // return true mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); // } // } done mv.visitLabel(l2); // Module module = clazz.getModule(); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModule", "()Ljava/lang/Module;", false); mv.visitVarInsn(ASTORE, 4); // if (!module.isNamed()) mv.visitVarInsn(ALOAD, 4); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isNamed", "()Z", false); Label l3 = new Label(); mv.visitJumpInsn(IFNE, l3); // { // debug ("!module.isNamed() ==> false"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("!module.isNamed() ==> false"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // return false mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); // } mv.visitLabel(l3); if (DEBUG) { // debug("module == " + module.getName()); mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_2); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("module == "); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_1); mv.visitVarInsn(ALOAD, 4); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "getName", "()Ljava/lang/String;", false); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // String pkg = clazz.getPackageName(); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getPackageName", "()Ljava/lang/String;", false); mv.visitVarInsn(ASTORE, 5); if (DEBUG) { // debug("pkg == " + pkg); mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_2); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("pkg == "); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_1); mv.visitVarInsn(ALOAD, 5); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // if (module.isExported(pkg, UNPRIVILEGED_MODULE)) mv.visitVarInsn(ALOAD, 4); mv.visitVarInsn(ALOAD, 5); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "UNPRIVILEGED_MODULE", "Ljava/lang/Module;"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isExported", "(Ljava/lang/String;Ljava/lang/Module;)Z", false); Label l4 = new Label(); mv.visitJumpInsn(IFEQ, l4); // { // debug ("module.isExported(pkg, UNPRIVILEGED_MODULE) ==> false"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("module.isExported(pkg, UNPRIVILEGED_MODULE) ==> false"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // return false mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); // } mv.visitLabel(l4); // debug(" ==> true"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn(" ==> true"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // return true mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); // } mv.visitMaxs(5, 6); mv.visitEnd(); } { // public void ensureAccess(AccessibleObject) { mv = cw.visitMethod(ACC_PUBLIC, "ensureAccess", "(Ljava/lang/reflect/AccessibleObject;)V", null, null); mv.visitCode(); // ensureModuleAccess(accessible); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "ensureModuleAccess", "(Ljava/lang/reflect/AccessibleObject;)V", false); // accessible.setAccessible(true); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/AccessibleObject", "setAccessible", "(Z)V", false); mv.visitInsn(RETURN); // } mv.visitMaxs(2, 2); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "createMethodInvoker", "(Ljava/lang/reflect/Method;)Lorg/jboss/byteman/agent/AccessibleMethodInvoker;", null, null); 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/IllegalAccessException"); // ensureModuleAccess(method); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "ensureModuleAccess", "(Ljava/lang/reflect/AccessibleObject;)V", false); // Lookup privateLookup = null; mv.visitInsn(ACONST_NULL); mv.visitVarInsn(ASTORE, 2); // try { mv.visitLabel(l0); // privateLookup = MethodHandles.privateLookupIn(method.getDeclaringClass(), theLookup); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "getDeclaringClass", "()Ljava/lang/Class;", false); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "theLookup", "Ljava/lang/invoke/MethodHandles$Lookup;"); mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "privateLookupIn", "(Ljava/lang/Class;Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/invoke/MethodHandles$Lookup;", false); mv.visitVarInsn(ASTORE, 2); mv.visitLabel(l1); Label l4 = new Label(); mv.visitJumpInsn(GOTO, l4); // } catch (IllegalArgumentException e) { mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 3); // method.setAccessible(true); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "setAccessible", "(Z)V", false); // return defaultAccessEnabler.createMethodInvoker(method, true); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "defaultAccessEnabler", "Lorg/jboss/byteman/agent/DefaultAccessEnabler;"); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/agent/DefaultAccessEnabler", "createMethodInvoker", "(Ljava/lang/reflect/Method;Z)Lorg/jboss/byteman/agent/AccessibleMethodInvoker;", false); mv.visitInsn(ARETURN); // } catch (IllegalAccessException e) { mv.visitLabel(l3); mv.visitVarInsn(ASTORE, 3); // } mv.visitLabel(l4); // return new JigsawAccessibleMethodInvoker(privateLookup, method); mv.visitTypeInsn(NEW, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker"); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker", "<init>", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Method;)V", false); mv.visitInsn(ARETURN); mv.visitMaxs(4, 4); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "createConstructorInvoker", "(Ljava/lang/reflect/Constructor;)Lorg/jboss/byteman/agent/AccessibleConstructorInvoker;", null, null); 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/IllegalAccessException"); // ensureModuleAccess(constructor); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "ensureModuleAccess", "(Ljava/lang/reflect/AccessibleObject;)V", false); // Lookup privateLookup = null; mv.visitInsn(ACONST_NULL); mv.visitVarInsn(ASTORE, 2); // try { mv.visitLabel(l0); // privateLookup = MethodHandles.privateLookupIn(constructor.getDeclaringClass(), theLookup) mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Constructor", "getDeclaringClass", "()Ljava/lang/Class;", false); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "theLookup", "Ljava/lang/invoke/MethodHandles$Lookup;"); mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "privateLookupIn", "(Ljava/lang/Class;Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/invoke/MethodHandles$Lookup;", false); mv.visitVarInsn(ASTORE, 2); mv.visitLabel(l1); Label l4 = new Label(); mv.visitJumpInsn(GOTO, l4); // } catch (IllegalArgumentException e) { mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 3); // constructor.setAccessible(true); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Constructor", "setAccessible", "(Z)V", false); // return defaultAccessEnabler.createConstructorInvoker(constructor); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "defaultAccessEnabler", "Lorg/jboss/byteman/agent/DefaultAccessEnabler;"); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/agent/DefaultAccessEnabler", "createConstructorInvoker", "(Ljava/lang/reflect/Constructor;Z)Lorg/jboss/byteman/agent/AccessibleConstructorInvoker;", false); mv.visitInsn(ARETURN); // } catch (IllegalAccessException e) { mv.visitLabel(l3); mv.visitVarInsn(ASTORE, 3); // } mv.visitLabel(l4); // return new JigsawAccessibleConstructorInvoker(privateLookup, constructor); mv.visitTypeInsn(NEW, "org/jboss/byteman/jigsaw/JigsawAccessibleConstructorInvoker"); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessibleConstructorInvoker", "<init>", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Constructor;)V", false); mv.visitInsn(ARETURN); mv.visitMaxs(4, 4); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "createFieldGetter", "(Ljava/lang/reflect/Field;)Lorg/jboss/byteman/agent/AccessibleFieldGetter;", null, null); 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/IllegalAccessException"); // ensureModuleAccess(field); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "ensureModuleAccess", "(Ljava/lang/reflect/AccessibleObject;)V", false); // Lookup privateLookup = null; mv.visitInsn(ACONST_NULL); mv.visitVarInsn(ASTORE, 2); // try { mv.visitLabel(l0); // privateLookup = MethodHandles.privateLookupIn(field.getDeclaringClass(), theLookup) mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getDeclaringClass", "()Ljava/lang/Class;", false); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "theLookup", "Ljava/lang/invoke/MethodHandles$Lookup;"); mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "privateLookupIn", "(Ljava/lang/Class;Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/invoke/MethodHandles$Lookup;", false); mv.visitVarInsn(ASTORE, 2); mv.visitLabel(l1); Label l4 = new Label(); mv.visitJumpInsn(GOTO, l4); // } catch (IllegalArgumentException e) { mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 3); // field.setAccessible(true); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "setAccessible", "(Z)V", false); // return defaultAccessEnabler.createFieldGetter(method); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "defaultAccessEnabler", "Lorg/jboss/byteman/agent/DefaultAccessEnabler;"); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/agent/DefaultAccessEnabler", "createFieldGetter", "(Ljava/lang/reflect/Field;Z)Lorg/jboss/byteman/agent/AccessibleFieldGetter;", false); mv.visitInsn(ARETURN); // } catch (IllegalAccessException e) { mv.visitLabel(l3); mv.visitVarInsn(ASTORE, 3); // } mv.visitLabel(l4); // return new JigsawAccessibleFieldGetter(privateLookup, field); mv.visitTypeInsn(NEW, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter"); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", "<init>", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Field;)V", false); mv.visitInsn(ARETURN); mv.visitMaxs(4, 4); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "createFieldSetter", "(Ljava/lang/reflect/Field;)Lorg/jboss/byteman/agent/AccessibleFieldSetter;", null, null); 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/IllegalAccessException"); // ensureModuleAccess(field); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "ensureModuleAccess", "(Ljava/lang/reflect/AccessibleObject;)V", false); // Lookup privateLookup = null; mv.visitInsn(ACONST_NULL); mv.visitVarInsn(ASTORE, 2); // try { mv.visitLabel(l0); // privateLookup = MethodHandles.privateLookupIn(field.getDeclaringClass(), theLookup) mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getDeclaringClass", "()Ljava/lang/Class;", false); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "theLookup", "Ljava/lang/invoke/MethodHandles$Lookup;"); mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "privateLookupIn", "(Ljava/lang/Class;Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/invoke/MethodHandles$Lookup;", false); mv.visitVarInsn(ASTORE, 2); mv.visitLabel(l1); Label l4 = new Label(); mv.visitJumpInsn(GOTO, l4); // } catch (IllegalArgumentException e) { mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 3); // field.setAccessible(true); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "setAccessible", "(Z)V", false); // return defaultAccessEnabler.createFieldSetter(method); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "defaultAccessEnabler", "Lorg/jboss/byteman/agent/DefaultAccessEnabler;"); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/agent/DefaultAccessEnabler", "createFieldSetter", "(Ljava/lang/reflect/Field;Z)Lorg/jboss/byteman/agent/AccessibleFieldSetter;", false); mv.visitInsn(ARETURN); // } catch (IllegalAccessException e) { mv.visitLabel(l3); mv.visitVarInsn(ASTORE, 3); // } mv.visitLabel(l4); // return new JigsawAccessibleFieldSetter(privateLookup, field); mv.visitTypeInsn(NEW, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter"); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter", "<init>", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Field;)V", false); mv.visitInsn(ARETURN); mv.visitMaxs(4, 4); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PRIVATE, "ensureModuleAccess", "(Ljava/lang/reflect/AccessibleObject;)V", null, null); mv.visitCode(); // Member member = (Member)accessible; mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, "java/lang/reflect/Member"); mv.visitVarInsn(ASTORE, 2); // Class<?> clazz = member.getDeclaringClass(); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/reflect/Member", "getDeclaringClass", "()Ljava/lang/Class;", true); mv.visitVarInsn(ASTORE, 3); // Module module = clazz.getModule(); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModule", "()Ljava/lang/Module;", false); mv.visitVarInsn(ASTORE, 4); // if (!module.isNamed()) { mv.visitVarInsn(ALOAD, 4); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isNamed", "()Z", false); Label l0 = new Label(); mv.visitJumpInsn(IFNE, l0); // if (!THIS_MODULE.canRead(module)) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE", "Ljava/lang/Module;"); mv.visitVarInsn(ALOAD, 4); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "canRead", "(Ljava/lang/Module;)Z", false); Label ltmp0 = new Label(); mv.visitJumpInsn(IFNE, ltmp0); // inst.redefineModule(THIS_MODULE, Set.of(module), EMPTY_EXPORTS_MAP, EMPTY_OPENS_MAP, EMPTY_USES_SET, EMPTY_PROVIDES_MAP); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "inst", "Ljava/lang/instrument/Instrumentation;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE", "Ljava/lang/Module;"); mv.visitVarInsn(ALOAD, 4); mv.visitMethodInsn(INVOKESTATIC, "java/util/Set", "of", "(Ljava/lang/Object;)Ljava/util/Set;", true); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_EXPORTS_MAP", "Ljava/util/Map;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_OPENS_MAP", "Ljava/util/Map;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_USES_SET", "Ljava/util/Set;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_PROVIDES_MAP", "Ljava/util/Map;"); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/instrument/Instrumentation", "redefineModule", "(Ljava/lang/Module;Ljava/util/Set;Ljava/util/Map;Ljava/util/Map;Ljava/util/Set;Ljava/util/Map;)V", true); // } mv.visitLabel(ltmp0); // return; mv.visitInsn(RETURN); // } mv.visitLabel(l0); // String pkg = clazz.getPackageName(); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getPackageName", "()Ljava/lang/String;", false); mv.visitVarInsn(ASTORE, 5); // if (!module.isOpen(pkg, THIS_MODULE)) { mv.visitVarInsn(ALOAD, 4); mv.visitVarInsn(ALOAD, 5); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE", "Ljava/lang/Module;"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isOpen", "(Ljava/lang/String;Ljava/lang/Module;)Z", false); Label l1 = new Label(); mv.visitJumpInsn(IFNE, l1); // Map<String, Set<Module>> extraOpens = Map.of(pkg, THIS_MODULE_SET); mv.visitVarInsn(ALOAD, 5); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE_SET", "Ljava/util/Set;"); mv.visitMethodInsn(INVOKESTATIC, "java/util/Map", "of", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;", true); mv.visitVarInsn(ASTORE, 6); // inst.redefineModule(module, EMPTY_READS_SET, EMPTY_EXPORTS_MAP, extraOpens, EMPTY_USES_SET, EMPTY_PROVIDES_MAP); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "inst", "Ljava/lang/instrument/Instrumentation;"); mv.visitVarInsn(ALOAD, 4); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_READS_SET", "Ljava/util/Set;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_EXPORTS_MAP", "Ljava/util/Map;"); mv.visitVarInsn(ALOAD, 6); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_USES_SET", "Ljava/util/Set;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_PROVIDES_MAP", "Ljava/util/Map;"); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/instrument/Instrumentation", "redefineModule", "(Ljava/lang/Module;Ljava/util/Set;Ljava/util/Map;Ljava/util/Map;Ljava/util/Set;Ljava/util/Map;)V", true); // inst.redefineModule(THIS_MODULE, Set.of(module), EMPTY_EXPORTS_MAP, extraOpens, EMPTY_USES_SET, EMPTY_PROVIDES_MAP); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "inst", "Ljava/lang/instrument/Instrumentation;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE", "Ljava/lang/Module;"); mv.visitVarInsn(ALOAD, 4); mv.visitMethodInsn(INVOKESTATIC, "java/util/Set", "of", "(Ljava/lang/Object;)Ljava/util/Set;", true); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_EXPORTS_MAP", "Ljava/util/Map;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_OPENS_MAP", "Ljava/util/Map;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_USES_SET", "Ljava/util/Set;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_PROVIDES_MAP", "Ljava/util/Map;"); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/instrument/Instrumentation", "redefineModule", "(Ljava/lang/Module;Ljava/util/Set;Ljava/util/Map;Ljava/util/Map;Ljava/util/Set;Ljava/util/Map;)V", true); mv.visitLabel(l1); // } mv.visitInsn(RETURN); mv.visitMaxs(7, 7); mv.visitEnd(); } { if (DEBUG) { mv = cw.visitMethod(ACC_PRIVATE + ACC_VARARGS, "debug", "([Ljava/lang/String;)V", null, null); mv.visitCode(); // StringBuilder builder = new StringBuilder(); mv.visitTypeInsn(NEW, "java/lang/StringBuilder"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false); mv.visitVarInsn(ASTORE, 2); // for (String s : args) mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ASTORE, 3); mv.visitVarInsn(ALOAD, 3); mv.visitInsn(ARRAYLENGTH); mv.visitVarInsn(ISTORE, 4); mv.visitInsn(ICONST_0); mv.visitVarInsn(ISTORE, 5); Label l0 = new Label(); mv.visitLabel(l0); // { // mv.visitVarInsn(ILOAD, 5); mv.visitVarInsn(ILOAD, 4); Label l1 = new Label(); mv.visitJumpInsn(IF_ICMPGE, l1); mv.visitVarInsn(ALOAD, 3); mv.visitVarInsn(ILOAD, 5); mv.visitInsn(AALOAD); // builder.append(s); mv.visitVarInsn(ASTORE, 6); mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 6); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false); mv.visitInsn(POP); mv.visitIincInsn(5, 1); mv.visitJumpInsn(GOTO, l0); // } mv.visitLabel(l1); // System.out.println(builder.toString()); mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false); mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); mv.visitInsn(RETURN); mv.visitMaxs(2, 7); mv.visitEnd(); } } cw.visitEnd(); return cw.toByteArray(); }
From source file:org.jboss.byteman.agent.JigsawAccessEnablerGenerator.java
License:Open Source License
private static byte[] getJigsawAccessibleConstructorInvokerClassBytes() { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); FieldVisitor fv;// w w w .j av a 2s . c o m MethodVisitor mv; cw.visit(V9, ACC_PUBLIC + ACC_SUPER, "org/jboss/byteman/jigsaw/JigsawAccessibleConstructorInvoker", null, "java/lang/Object", new String[] { "org/jboss/byteman/agent/AccessibleConstructorInvoker" }); cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup", ACC_PUBLIC + ACC_FINAL + ACC_STATIC); { fv = cw.visitField(ACC_PRIVATE, "handle", "Ljava/lang/invoke/MethodHandle;", null, null); fv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Constructor;)V", null, null); mv.visitCode(); Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception"); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); mv.visitLabel(l0); mv.visitFieldInsn(GETSTATIC, "java/lang/Void", "TYPE", "Ljava/lang/Class;"); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Constructor", "getParameterTypes", "()[Ljava/lang/Class;", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodType", "methodType", "(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;", false); mv.visitVarInsn(ASTORE, 3); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Constructor", "getDeclaringClass", "()Ljava/lang/Class;", false); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandles$Lookup", "findConstructor", "(Ljava/lang/Class;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;", false); mv.visitVarInsn(ASTORE, 4); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Constructor", "isVarArgs", "()Z", false); Label l3 = new Label(); mv.visitJumpInsn(IFEQ, l3); mv.visitVarInsn(ALOAD, 4); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "asFixedArity", "()Ljava/lang/invoke/MethodHandle;", false); mv.visitVarInsn(ASTORE, 4); mv.visitLabel(l3); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 4); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleConstructorInvoker", "handle", "Ljava/lang/invoke/MethodHandle;"); mv.visitLabel(l1); Label l4 = new Label(); mv.visitJumpInsn(GOTO, l4); mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 3); mv.visitTypeInsn(NEW, "java/lang/RuntimeException"); mv.visitInsn(DUP); mv.visitLdcInsn( "JigsawAccessibleConstructorInvoker : exception creating method handle for constructor "); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;Ljava/lang/Throwable;)V", false); mv.visitInsn(ATHROW); mv.visitLabel(l4); mv.visitInsn(RETURN); mv.visitMaxs(4, 5); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "invoke", "([Ljava/lang/Object;)Ljava/lang/Object;", 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/jboss/byteman/jigsaw/JigsawAccessibleConstructorInvoker", "handle", "Ljava/lang/invoke/MethodHandle;"); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeWithArguments", "([Ljava/lang/Object;)Ljava/lang/Object;", false); mv.visitLabel(l1); mv.visitInsn(ARETURN); mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 2); mv.visitTypeInsn(NEW, "org/jboss/byteman/rule/exception/ExecuteException"); mv.visitInsn(DUP); mv.visitLdcInsn("JigsawAccessibleConstructorInvoker.invoke : exception invoking methodhandle "); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/rule/exception/ExecuteException", "<init>", "(Ljava/lang/String;Ljava/lang/Throwable;)V", false); mv.visitInsn(ATHROW); mv.visitMaxs(4, 3); mv.visitEnd(); } cw.visitEnd(); return cw.toByteArray(); }
From source file:org.jboss.byteman.agent.JigsawAccessEnablerGenerator.java
License:Open Source License
private static byte[] getJigsawAccessibleMethodInvokerClassBytes() { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); FieldVisitor fv;// ww w . j ava 2 s . co m MethodVisitor mv; cw.visit(V9, ACC_PUBLIC + ACC_SUPER, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker", null, "java/lang/Object", new String[] { "org/jboss/byteman/agent/AccessibleMethodInvoker" }); cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup", ACC_PUBLIC + ACC_FINAL + ACC_STATIC); { fv = cw.visitField(ACC_PRIVATE, "handle", "Ljava/lang/invoke/MethodHandle;", null, null); fv.visitEnd(); } { fv = cw.visitField(ACC_PRIVATE, "isStatic", "Z", null, null); fv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Method;)V", null, null); mv.visitCode(); Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception"); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); mv.visitLabel(l0); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "getReturnType", "()Ljava/lang/Class;", false); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "getParameterTypes", "()[Ljava/lang/Class;", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodType", "methodType", "(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;", false); mv.visitVarInsn(ASTORE, 3); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "getModifiers", "()I", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/reflect/Modifier", "isStatic", "(I)Z", false); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker", "isStatic", "Z"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker", "isStatic", "Z"); Label l3 = new Label(); mv.visitJumpInsn(IFEQ, l3); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "getDeclaringClass", "()Ljava/lang/Class;", false); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "getName", "()Ljava/lang/String;", false); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandles$Lookup", "findStatic", "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;", false); mv.visitVarInsn(ASTORE, 4); Label l4 = new Label(); mv.visitJumpInsn(GOTO, l4); mv.visitLabel(l3); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "getDeclaringClass", "()Ljava/lang/Class;", false); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "getName", "()Ljava/lang/String;", false); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandles$Lookup", "findVirtual", "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;", false); mv.visitVarInsn(ASTORE, 4); mv.visitLabel(l4); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "isVarArgs", "()Z", false); Label l5 = new Label(); mv.visitJumpInsn(IFEQ, l5); mv.visitVarInsn(ALOAD, 4); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "asFixedArity", "()Ljava/lang/invoke/MethodHandle;", false); mv.visitVarInsn(ASTORE, 4); mv.visitLabel(l5); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 4); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker", "handle", "Ljava/lang/invoke/MethodHandle;"); mv.visitLabel(l1); Label l6 = new Label(); mv.visitJumpInsn(GOTO, l6); mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 3); mv.visitTypeInsn(NEW, "java/lang/RuntimeException"); mv.visitInsn(DUP); mv.visitLdcInsn("JigsawAccessibleMethodInvoker : exception creating methodhandle for method "); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;Ljava/lang/Throwable;)V", false); mv.visitInsn(ATHROW); mv.visitLabel(l6); mv.visitInsn(RETURN); mv.visitMaxs(4, 5); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "invoke", "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;", null, null); mv.visitCode(); Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Throwable"); Label l3 = new Label(); Label l4 = new Label(); mv.visitTryCatchBlock(l3, l4, l2, "java/lang/Throwable"); mv.visitLabel(l0); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker", "isStatic", "Z"); mv.visitJumpInsn(IFEQ, l3); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker", "handle", "Ljava/lang/invoke/MethodHandle;"); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeWithArguments", "([Ljava/lang/Object;)Ljava/lang/Object;", false); mv.visitLabel(l1); mv.visitInsn(ARETURN); mv.visitLabel(l3); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker", "handle", "Ljava/lang/invoke/MethodHandle;"); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "bindTo", "(Ljava/lang/Object;)Ljava/lang/invoke/MethodHandle;", false); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeWithArguments", "([Ljava/lang/Object;)Ljava/lang/Object;", false); mv.visitLabel(l4); mv.visitInsn(ARETURN); mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 3); mv.visitTypeInsn(NEW, "org/jboss/byteman/rule/exception/ExecuteException"); mv.visitInsn(DUP); mv.visitLdcInsn("JigsawAccessibleMethodInvoker.invoke : exception invoking methodhandle "); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/rule/exception/ExecuteException", "<init>", "(Ljava/lang/String;Ljava/lang/Throwable;)V", false); mv.visitInsn(ATHROW); mv.visitMaxs(4, 4); mv.visitEnd(); } cw.visitEnd(); return cw.toByteArray(); }
From source file:org.jboss.byteman.agent.JigsawAccessEnablerGenerator.java
License:Open Source License
private static byte[] getJigsawAccessibleFieldGetterClassBytes() { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); FieldVisitor fv;// w w w. ja v a2 s .c o m MethodVisitor mv; cw.visit(V9, ACC_PUBLIC + ACC_SUPER, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", null, "java/lang/Object", new String[] { "org/jboss/byteman/agent/AccessibleFieldGetter" }); cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup", ACC_PUBLIC + ACC_FINAL + ACC_STATIC); { fv = cw.visitField(ACC_PRIVATE, "handle", "Ljava/lang/invoke/MethodHandle;", null, null); fv.visitEnd(); } { fv = cw.visitField(0, "isStatic", "Z", null, null); fv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Field;)V", null, null); mv.visitCode(); Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception"); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getModifiers", "()I", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/reflect/Modifier", "isStatic", "(I)Z", false); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", "isStatic", "Z"); mv.visitLabel(l0); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", "isStatic", "Z"); Label l3 = new Label(); mv.visitJumpInsn(IFEQ, l3); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getDeclaringClass", "()Ljava/lang/Class;", false); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getName", "()Ljava/lang/String;", false); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getType", "()Ljava/lang/Class;", false); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandles$Lookup", "findStaticGetter", "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;", false); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", "handle", "Ljava/lang/invoke/MethodHandle;"); mv.visitJumpInsn(GOTO, l1); mv.visitLabel(l3); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getDeclaringClass", "()Ljava/lang/Class;", false); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getName", "()Ljava/lang/String;", false); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getType", "()Ljava/lang/Class;", false); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandles$Lookup", "findGetter", "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;", false); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", "handle", "Ljava/lang/invoke/MethodHandle;"); mv.visitLabel(l1); Label l4 = new Label(); mv.visitJumpInsn(GOTO, l4); mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 3); mv.visitTypeInsn(NEW, "java/lang/RuntimeException"); mv.visitInsn(DUP); mv.visitLdcInsn("JigsawAccessibleFieldGetter : exception creating getter method handle for field "); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;Ljava/lang/Throwable;)V", false); mv.visitInsn(ATHROW); mv.visitLabel(l4); mv.visitInsn(RETURN); mv.visitMaxs(5, 4); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "get", "(Ljava/lang/Object;)Ljava/lang/Object;", null, null); mv.visitCode(); Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Throwable"); Label l3 = new Label(); Label l4 = new Label(); mv.visitTryCatchBlock(l3, l4, l2, "java/lang/Throwable"); mv.visitLabel(l0); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", "isStatic", "Z"); mv.visitJumpInsn(IFEQ, l3); mv.visitVarInsn(ALOAD, 1); Label l5 = new Label(); mv.visitJumpInsn(IFNULL, l5); mv.visitTypeInsn(NEW, "org/jboss/byteman/rule/exception/ExecuteException"); mv.visitInsn(DUP); mv.visitLdcInsn("JigsawAccessibleFieldGetter.get : expecting null owner for static get!"); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/rule/exception/ExecuteException", "<init>", "(Ljava/lang/String;)V", false); mv.visitInsn(ATHROW); mv.visitLabel(l5); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", "handle", "Ljava/lang/invoke/MethodHandle;"); mv.visitInsn(ICONST_0); mv.visitTypeInsn(ANEWARRAY, "java/lang/Object"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeWithArguments", "([Ljava/lang/Object;)Ljava/lang/Object;", false); mv.visitLabel(l1); mv.visitInsn(ARETURN); mv.visitLabel(l3); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", "handle", "Ljava/lang/invoke/MethodHandle;"); 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(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeWithArguments", "([Ljava/lang/Object;)Ljava/lang/Object;", false); mv.visitLabel(l4); mv.visitInsn(ARETURN); mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 2); mv.visitTypeInsn(NEW, "org/jboss/byteman/rule/exception/ExecuteException"); mv.visitInsn(DUP); mv.visitLdcInsn("JigsawAccessibleFieldGetter.invoke : exception invoking getter methodhandle "); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/rule/exception/ExecuteException", "<init>", "(Ljava/lang/String;Ljava/lang/Throwable;)V", false); mv.visitInsn(ATHROW); mv.visitMaxs(5, 3); mv.visitEnd(); } cw.visitEnd(); return cw.toByteArray(); }