List of usage examples for org.objectweb.asm MethodVisitor visitJumpInsn
public void visitJumpInsn(final int opcode, final Label label)
From source file:org.jayware.e2.component.impl.generation.writer.ComponentCopyOtherMethodWriter.java
License:Open Source License
public void writeCopyOtherMethodFor(ComponentGenerationPlan componentPlan) { final Class<? extends Component> componentClass = componentPlan.getComponentClass(); final ClassWriter classWriter = componentPlan.getClassWriter(); final MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "copy", "(" + getDescriptor(Component.class) + ")" + getDescriptor(Component.class), null, null); final Label endIfNotInstanceOf = new Label(); visitor.visitCode();//from w w w .j av a 2 s.com visitor.visitVarInsn(ALOAD, 1); visitor.visitInsn(DUP); visitor.visitTypeInsn(INSTANCEOF, getInternalName(componentClass)); visitor.visitJumpInsn(IFNE, endIfNotInstanceOf); visitor.visitTypeInsn(NEW, getInternalName(IllegalArgumentException.class)); visitor.visitInsn(DUP); visitor.visitLdcInsn("Copy source type has to be: " + componentClass); visitor.visitMethodInsn(INVOKESPECIAL, getInternalName(IllegalArgumentException.class), "<init>", "(" + getDescriptor(String.class) + ")V", false); visitor.visitInsn(ATHROW); visitor.visitLabel(endIfNotInstanceOf); visitor.visitTypeInsn(CHECKCAST, getInternalName(componentClass)); visitor.visitVarInsn(ASTORE, 2); for (ComponentPropertyGenerationPlan propertyPlan : componentPlan.getComponentPropertyGenerationPlans()) { final String propertyName = propertyPlan.getPropertyName(); final Class<?> propertyType = propertyPlan.getPropertyType(); final String propertyTypeDescriptor = Type.getDescriptor(propertyPlan.getPropertyType()); visitor.visitVarInsn(ALOAD, 0); visitor.visitVarInsn(ALOAD, 2); visitor.visitMethodInsn(INVOKEINTERFACE, getInternalName(componentClass), propertyPlan.getPropertyGetterMethodName(), propertyPlan.getPropertyGetterMethodDescriptor(), true); final Label ifNotNull = new Label(); final Label endIfNotNull = new Label(); if (propertyType.isArray()) { visitor.visitVarInsn(ASTORE, 3); visitor.visitVarInsn(ALOAD, 3); visitor.visitJumpInsn(IFNONNULL, ifNotNull); visitor.visitInsn(ACONST_NULL); visitor.visitJumpInsn(GOTO, endIfNotNull); visitor.visitLabel(ifNotNull); visitor.visitVarInsn(ALOAD, 3); visitor.visitInsn(ARRAYLENGTH); if (propertyType.getComponentType().isPrimitive()) { visitor.visitIntInsn(NEWARRAY, resolveOpcodePrimitiveType(propertyType.getComponentType())); } else { visitor.visitTypeInsn(ANEWARRAY, getInternalName(propertyType.getComponentType())); } visitor.visitVarInsn(ASTORE, 4); final Label endForLoop = new Label(); final Label headForLoop = new Label(); visitor.visitInsn(ICONST_0); visitor.visitVarInsn(ISTORE, 5); visitor.visitLabel(headForLoop); visitor.visitVarInsn(ILOAD, 5); visitor.visitVarInsn(ALOAD, 3); visitor.visitInsn(ARRAYLENGTH); visitor.visitJumpInsn(IF_ICMPGE, endForLoop); visitor.visitVarInsn(ALOAD, 4); visitor.visitVarInsn(ILOAD, 5); visitor.visitVarInsn(ALOAD, 3); visitor.visitVarInsn(ILOAD, 5); visitor.visitInsn(getType(propertyType.getComponentType()).getOpcode(IALOAD)); visitor.visitInsn(getType(propertyType.getComponentType()).getOpcode(IASTORE)); visitor.visitIincInsn(5, 1); visitor.visitJumpInsn(GOTO, headForLoop); visitor.visitLabel(endForLoop); visitor.visitVarInsn(ALOAD, 4); } visitor.visitLabel(endIfNotNull); visitor.visitFieldInsn(PUTFIELD, componentPlan.getGeneratedClassInternalName(), propertyName, propertyTypeDescriptor); } visitor.visitVarInsn(ALOAD, 0); visitor.visitInsn(ARETURN); visitor.visitMaxs(0, 0); visitor.visitEnd(); }
From source file:org.jayware.e2.component.impl.generation.writer.ComponentGetMethodWriter.java
License:Open Source License
public void writeGetMethodFor(ComponentGenerationPlan componentPlan) { final String classInternalName = componentPlan.getGeneratedClassInternalName(); final ClassWriter classWriter = componentPlan.getClassWriter(); final MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "get", "(Ljava/lang/String;)Ljava/lang/String;", null, null); visitor.visitCode();/*from w w w .j a va 2s . c o m*/ for (ComponentPropertyGenerationPlan propertyPlan : componentPlan.getComponentPropertyGenerationPlans()) { final String propertyName = propertyPlan.getPropertyName(); final Class<?> propertyType = propertyPlan.getPropertyType(); final String propertyTypeDescriptor = Type.getDescriptor(propertyPlan.getPropertyType()); final Label endIfPropertyNameEqualsLabel = new Label(); visitor.visitLdcInsn(propertyName); visitor.visitVarInsn(ALOAD, 1); visitor.visitMethodInsn(INVOKEVIRTUAL, getInternalName(String.class), "equals", "(Ljava/lang/Object;)Z", false); visitor.visitJumpInsn(IFEQ, endIfPropertyNameEqualsLabel); if (propertyType.isPrimitive() || propertyType.isArray() && propertyType.getComponentType().isPrimitive()) { if (propertyType.isArray()) { visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, classInternalName, propertyName, propertyTypeDescriptor); visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Arrays.class), "toString", "(" + propertyTypeDescriptor + ")" + getDescriptor(String.class), false); } else { visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, classInternalName, propertyName, propertyTypeDescriptor); visitor.visitMethodInsn(INVOKESTATIC, "java/lang/String", "valueOf", "(" + propertyTypeDescriptor + ")Ljava/lang/String;", false); } } else if (propertyType.isEnum()) { final Label ifEnumValueNonNull = new Label(); final Label endIf = new Label(); visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, classInternalName, propertyName, propertyTypeDescriptor); visitor.visitVarInsn(ASTORE, 2); visitor.visitVarInsn(ALOAD, 2); visitor.visitJumpInsn(IFNONNULL, ifEnumValueNonNull); visitor.visitInsn(ACONST_NULL); visitor.visitJumpInsn(GOTO, endIf); visitor.visitLabel(ifEnumValueNonNull); visitor.visitVarInsn(ALOAD, 2); visitor.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Enum.class), "name", "()Ljava/lang/String;", false); visitor.visitLabel(endIf); } else if (String.class.equals(propertyType)) { visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, classInternalName, propertyName, propertyTypeDescriptor); } else if (!propertyType.isPrimitive() || propertyType.isArray() && !propertyType.getComponentType().isPrimitive()) { final Label endIfAdapterNull = new Label(); visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, getInternalName(AbstractComponent.class), "myComponentManager", getDescriptor(ComponentManager.class)); visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, getInternalName(AbstractComponent.class), "myContext", getDescriptor(Context.class)); visitor.visitLdcInsn(getType(propertyType)); visitor.visitMethodInsn(INVOKEINTERFACE, getInternalName(ComponentManager.class), "getPropertyAdapter", "(" + getDescriptor(Context.class) + getDescriptor(Class.class) + ")" + getDescriptor(ComponentPropertyAdapter.class), true); visitor.visitVarInsn(ASTORE, 2); visitor.visitVarInsn(ALOAD, 2); visitor.visitJumpInsn(IFNONNULL, endIfAdapterNull); visitor.visitTypeInsn(NEW, getInternalName(ComponentMarshalException.class)); visitor.visitInsn(DUP); visitor.visitLdcInsn("No property adapter found for property '" + propertyName + "' of type '" + propertyType.getName() + "'"); visitor.visitMethodInsn(INVOKESPECIAL, getInternalName(ComponentMarshalException.class), "<init>", "(" + getDescriptor(String.class) + ")V", false); visitor.visitInsn(ATHROW); visitor.visitLabel(endIfAdapterNull); visitor.visitVarInsn(ALOAD, 2); visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, getInternalName(AbstractComponent.class), "myContext", getDescriptor(Context.class)); visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, classInternalName, propertyName, propertyTypeDescriptor); visitor.visitMethodInsn(INVOKEINTERFACE, getInternalName(ComponentPropertyAdapter.class), "marshal", "(" + getDescriptor(Context.class) + getDescriptor(Object.class) + ")" + getDescriptor(String.class), true); } else { throw new ComponentFactoryException(); } visitor.visitInsn(ARETURN); visitor.visitLabel(endIfPropertyNameEqualsLabel); } visitor.visitInsn(ACONST_NULL); visitor.visitInsn(ARETURN); visitor.visitMaxs(0, 0); visitor.visitEnd(); }
From source file:org.jayware.e2.component.impl.generation.writer.ComponentSetMethodWriter.java
License:Open Source License
public void writeSetMethodFor(ComponentGenerationPlan componentPlan) { final String classInternalName = componentPlan.getGeneratedClassInternalName(); final ClassWriter classWriter = componentPlan.getClassWriter(); final MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "set", "(Ljava/lang/String;Ljava/lang/String;)Z", null, null); visitor.visitCode();//from w w w . j a va2s. co m for (ComponentPropertyGenerationPlan propertyPlan : componentPlan.getComponentPropertyGenerationPlans()) { final String propertyName = propertyPlan.getPropertyName(); final Class<?> propertyType = propertyPlan.getPropertyType(); final Label endIfPropertyNameEqualsLabel = new Label(); visitor.visitLdcInsn(propertyName); visitor.visitVarInsn(ALOAD, 1); visitor.visitMethodInsn(INVOKEVIRTUAL, getInternalName(String.class), "equals", "(Ljava/lang/Object;)Z", false); visitor.visitJumpInsn(IFEQ, endIfPropertyNameEqualsLabel); visitor.visitVarInsn(ALOAD, 0); if (propertyType.isPrimitive() || propertyType.isArray() && propertyType.getComponentType().isPrimitive()) { if (!propertyType.isArray()) { visitor.visitVarInsn(ALOAD, 2); if (boolean.class.equals(propertyType)) { visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Boolean.class), "parseBoolean", "(Ljava/lang/String;)Z", false); } else if (byte.class.equals(propertyType)) { visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Byte.class), "parseByte", "(Ljava/lang/String;)B", false); } else if (short.class.equals(propertyType)) { visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Short.class), "parseShort", "(Ljava/lang/String;)S", false); } else if (int.class.equals(propertyType)) { visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Integer.class), "parseInt", "(Ljava/lang/String;)I", false); } else if (float.class.equals(propertyType)) { visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Float.class), "parseFloat", "(Ljava/lang/String;)F", false); } else if (double.class.equals(propertyType)) { visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Double.class), "parseDouble", "(Ljava/lang/String;)D", false); } } else { visitor.visitVarInsn(ALOAD, 2); visitor.visitInsn(ICONST_1); visitor.visitVarInsn(ALOAD, 2); visitor.visitMethodInsn(INVOKEVIRTUAL, getInternalName(String.class), "length", "()I", false); visitor.visitInsn(ICONST_1); visitor.visitInsn(ISUB); visitor.visitMethodInsn(INVOKEVIRTUAL, getInternalName(String.class), "substring", "(II)" + getDescriptor(String.class), false); visitor.visitVarInsn(ASTORE, 2); visitor.visitVarInsn(ALOAD, 2); visitor.visitLdcInsn(", "); visitor.visitMethodInsn(INVOKEVIRTUAL, getInternalName(String.class), "split", "(" + getDescriptor(String.class) + ")[" + getDescriptor(String.class), false); visitor.visitVarInsn(ASTORE, 3); visitor.visitVarInsn(ALOAD, 3); visitor.visitInsn(ARRAYLENGTH); visitor.visitIntInsn(NEWARRAY, resolveOpcodePrimitiveType(propertyType.getComponentType())); visitor.visitVarInsn(ASTORE, 4); final Label endForLoop = new Label(); final Label headForLoop = new Label(); visitor.visitInsn(ICONST_0); visitor.visitVarInsn(ISTORE, 5); visitor.visitLabel(headForLoop); visitor.visitVarInsn(ILOAD, 5); visitor.visitVarInsn(ALOAD, 3); visitor.visitInsn(ARRAYLENGTH); visitor.visitJumpInsn(IF_ICMPGE, endForLoop); visitor.visitVarInsn(ALOAD, 4); visitor.visitVarInsn(ILOAD, 5); visitor.visitVarInsn(ALOAD, 3); visitor.visitVarInsn(ILOAD, 5); visitor.visitInsn(AALOAD); if (boolean.class.equals(propertyType.getComponentType())) { visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Boolean.class), "parseBoolean", "(Ljava/lang/String;)Z", false); } else if (byte.class.equals(propertyType.getComponentType())) { visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Byte.class), "parseByte", "(Ljava/lang/String;)B", false); } else if (short.class.equals(propertyType.getComponentType())) { visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Short.class), "parseShort", "(Ljava/lang/String;)S", false); } else if (int.class.equals(propertyType.getComponentType())) { visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Integer.class), "parseInt", "(Ljava/lang/String;)I", false); } else if (float.class.equals(propertyType.getComponentType())) { visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Float.class), "parseFloat", "(Ljava/lang/String;)F", false); } else if (double.class.equals(propertyType.getComponentType())) { visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Double.class), "parseDouble", "(Ljava/lang/String;)D", false); } visitor.visitInsn(getType(propertyType.getComponentType()).getOpcode(IASTORE)); visitor.visitIincInsn(5, 1); visitor.visitJumpInsn(GOTO, headForLoop); visitor.visitLabel(endForLoop); visitor.visitVarInsn(ALOAD, 4); } } else if (propertyType.isEnum()) { final Label ifEnumValueNonNull = new Label(); final Label endIf = new Label(); visitor.visitVarInsn(ALOAD, 2); visitor.visitJumpInsn(IFNONNULL, ifEnumValueNonNull); visitor.visitInsn(ACONST_NULL); visitor.visitJumpInsn(GOTO, endIf); visitor.visitLabel(ifEnumValueNonNull); visitor.visitLdcInsn(getType(propertyType)); visitor.visitVarInsn(ALOAD, 2); visitor.visitMethodInsn(INVOKESTATIC, getInternalName(Enum.class), "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;", false); visitor.visitTypeInsn(CHECKCAST, getInternalName(propertyType)); visitor.visitLabel(endIf); } else if (String.class.equals(propertyType)) { visitor.visitVarInsn(ALOAD, 2); } else if (!propertyType.isPrimitive() || propertyType.isArray() && !propertyType.getComponentType().isPrimitive()) { final Label endIfAdapterNull = new Label(); visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, getInternalName(AbstractComponent.class), "myComponentManager", getDescriptor(ComponentManager.class)); visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, getInternalName(AbstractComponent.class), "myContext", getDescriptor(Context.class)); visitor.visitLdcInsn(getType(propertyType)); visitor.visitMethodInsn(INVOKEINTERFACE, getInternalName(ComponentManager.class), "getPropertyAdapter", "(" + getDescriptor(Context.class) + getDescriptor(Class.class) + ")" + getDescriptor(ComponentPropertyAdapter.class), true); visitor.visitVarInsn(ASTORE, 3); visitor.visitVarInsn(ALOAD, 3); visitor.visitJumpInsn(IFNONNULL, endIfAdapterNull); visitor.visitTypeInsn(NEW, getInternalName(ComponentUnmarshalException.class)); visitor.visitInsn(DUP); visitor.visitLdcInsn("No property adapter found for property '" + propertyName + "' of type '" + propertyType.getName() + "'"); visitor.visitMethodInsn(INVOKESPECIAL, getInternalName(ComponentUnmarshalException.class), "<init>", "(" + getDescriptor(String.class) + ")V", false); visitor.visitInsn(ATHROW); visitor.visitLabel(endIfAdapterNull); visitor.visitVarInsn(ALOAD, 3); visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, getInternalName(AbstractComponent.class), "myContext", getDescriptor(Context.class)); visitor.visitVarInsn(ALOAD, 2); visitor.visitMethodInsn(INVOKEINTERFACE, getInternalName(ComponentPropertyAdapter.class), "unmarshal", "(" + getDescriptor(Context.class) + getDescriptor(String.class) + ")" + getDescriptor(Object.class), true); visitor.visitTypeInsn(CHECKCAST, getType(propertyType).getInternalName()); } else { throw new ComponentFactoryException(); } visitor.visitFieldInsn(PUTFIELD, classInternalName, propertyName, Type.getDescriptor(propertyPlan.getPropertyType())); visitor.visitInsn(ICONST_1); visitor.visitInsn(IRETURN); visitor.visitLabel(endIfPropertyNameEqualsLabel); } visitor.visitInsn(ICONST_0); visitor.visitInsn(IRETURN); visitor.visitMaxs(0, 0); visitor.visitEnd(); }
From source file:org.jayware.e2.event.impl.EventDispatcherFactoryImpl.java
License:Open Source License
private void createEventDispatcher(TargetDescriptor targetDescriptor) { final ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES); final Class<?> target = targetDescriptor.target; final String className = createDispatcherName(target); final String classInternalName = className.replace('.', '/'); final String classFileName = classInternalName + ".class"; final File classFile = new File(myOutputDirectory, classFileName); classWriter.visit(V1_8, ACC_PUBLIC + ACC_SUPER, classInternalName, null, getInternalName(Object.class), new String[] { getInternalName(EventDispatcher.class) }); {/* www. j a v a 2s . c o m*/ final FieldVisitor fv = classWriter.visitField(ACC_PUBLIC + ACC_STATIC + ACC_FINAL, "log", getDescriptor(Logger.class), null, null); } { // <static> final MethodVisitor mv = classWriter.visitMethod(ACC_PUBLIC + ACC_STATIC, "<clinit>", "()V", null, null); mv.visitCode(); mv.visitLdcInsn(getType(EventDispatcher.class)); mv.visitMethodInsn(INVOKESTATIC, getInternalName(LoggerFactory.class), "getLogger", "(Ljava/lang/Class;)" + getDescriptor(Logger.class), false); mv.visitFieldInsn(PUTSTATIC, classInternalName, "log", getDescriptor(Logger.class)); mv.visitInsn(RETURN); mv.visitMaxs(0, 0); mv.visitEnd(); } { // Constructor final MethodVisitor mv = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, getInternalName(Object.class), "<init>", "()V", false); mv.visitInsn(RETURN); mv.visitMaxs(0, 0); mv.visitEnd(); } { // dispatch final MethodVisitor mv = classWriter.visitMethod(ACC_PUBLIC, "dispatch", "(" + getDescriptor(Event.class) + getDescriptor(Object.class) + ")V", null, null); final Label endMethod = new Label(); mv.visitCode(); // Is this a suitable dispatcher for the passed target? Sub-classes are // not allowed, therefore check the passed target's class for equality. mv.visitLdcInsn(targetDescriptor.getTargetType()); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Object.class), "getClass", "()Ljava/lang/Class;", false); mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Class.class), "equals", "(Ljava/lang/Object;)Z", false); mv.visitJumpInsn(IFEQ, endMethod); // Yeah...the right target...let's cast! mv.visitVarInsn(ALOAD, 2); mv.visitTypeInsn(CHECKCAST, targetDescriptor.getTargetInternalName()); mv.visitVarInsn(ASTORE, 3); for (Class<? extends EventType> eventType : targetDescriptor.getEventTypeSet()) { final Label endEvenType = new Label(); // Does the event match an event-type one of the handlers is interested? mv.visitVarInsn(ALOAD, 1); mv.visitLdcInsn(getType(eventType)); mv.visitMethodInsn(INVOKEINTERFACE, getInternalName(Event.class), "matches", "(Ljava/lang/Class;)Z", true); mv.visitJumpInsn(IFEQ, endEvenType); for (HandlerDescriptor descriptor : targetDescriptor.eventTypeHandlerDescriptorMap.get(eventType)) { final Label endHandler = new Label(); // Required and conditional parameters have to be present for (HandlerDescriptor.ParameterDescriptor parameter : descriptor.getParameters()) { if (!parameter.isEventParameter()) { if (parameter.presence == Presence.Required || parameter.presence == Presence.Conditional) { final Label parameterNotPresent = new Label(); mv.visitVarInsn(ALOAD, 1); mv.visitLdcInsn(parameter.getName()); mv.visitMethodInsn(INVOKEINTERFACE, getInternalName(Event.class), "hasParameter", "(Ljava/lang/String;)Z", true); mv.visitJumpInsn(IFNE, parameterNotPresent); mv.visitFieldInsn(GETSTATIC, classInternalName, "log", getDescriptor(Logger.class)); mv.visitLdcInsn("Could not dispatch '" + eventType.getName() + "' to " + descriptor.getMethod() + "', because the event does not provide the " + parameter.getPresence().toString().toLowerCase() + " parameter '" + parameter.getName() + "'!"); mv.visitMethodInsn(INVOKEINTERFACE, getInternalName(Logger.class), "error", "(Ljava/lang/String;)V", true); mv.visitJumpInsn(GOTO, endHandler); mv.visitLabel(parameterNotPresent); } } } final int startIndex = 4; int index = startIndex; for (HandlerDescriptor.ParameterDescriptor parameter : descriptor.getParameters()) { final Class parameterType = parameter.getParameterClass(); if (!parameter.isEventParameter()) { final Label endInstanceOf = new Label(); // Extract the parameter from the event and store it to a variable. mv.visitVarInsn(ALOAD, 1); mv.visitLdcInsn(parameter.getName()); mv.visitMethodInsn(INVOKEINTERFACE, getInternalName(Event.class), "getParameter", "(Ljava/lang/String;)Ljava/lang/Object;", true); mv.visitVarInsn(ASTORE, index); // A required parameter mustn't be null ... if (parameter.presence == Presence.Required) { final Label notNull = new Label(); mv.visitVarInsn(ALOAD, index); mv.visitJumpInsn(IFNONNULL, notNull); mv.visitFieldInsn(GETSTATIC, classInternalName, "log", getDescriptor(Logger.class)); mv.visitLdcInsn("Could not dispatch '" + eventType.getName() + "' to " + descriptor.getMethod() + "', because the " + Presence.Required.toString().toLowerCase() + " parameter '" + parameter.getName() + "' was null!"); mv.visitMethodInsn(INVOKEINTERFACE, getInternalName(Logger.class), "error", "(Ljava/lang/String;)V", true); mv.visitJumpInsn(GOTO, endHandler); mv.visitLabel(notNull); } else // ...but instanceof-check is bad if the parameter is null // which is legal for conditional and optional parameters. { mv.visitVarInsn(ALOAD, index); mv.visitJumpInsn(IFNULL, endInstanceOf); } // Check the type of the parameter (only if it is not null) // whether it matches the declared parameter type of the handler. mv.visitVarInsn(ALOAD, index); Class appropriateType = parameterType; if (parameterType.isPrimitive()) { if (boolean.class.equals(parameterType)) { appropriateType = Boolean.class; } else if (byte.class.equals(parameterType)) { appropriateType = Byte.class; } else if (short.class.equals(parameterType)) { appropriateType = Short.class; } else if (int.class.equals(parameterType)) { appropriateType = Integer.class; } else if (long.class.equals(parameterType)) { appropriateType = Long.class; } else if (float.class.equals(parameterType)) { appropriateType = Float.class; } else if (double.class.equals(parameterType)) { appropriateType = Double.class; } } mv.visitTypeInsn(INSTANCEOF, getInternalName(appropriateType)); mv.visitJumpInsn(IFNE, endInstanceOf); mv.visitFieldInsn(GETSTATIC, classInternalName, "log", getDescriptor(Logger.class)); mv.visitLdcInsn("Could not dispatch '" + eventType.getName() + "' to " + descriptor.getMethod() + "', because the parameter '" + parameter.getName() + "' cannot be cast to the appropriate type '" + parameterType.getName() + "'!"); mv.visitMethodInsn(INVOKEINTERFACE, getInternalName(Logger.class), "error", "(Ljava/lang/String;)V", true); mv.visitJumpInsn(GOTO, endHandler); mv.visitLabel(endInstanceOf); ++index; } } mv.visitVarInsn(ALOAD, 3); // Load and cast all necessary parameters. index = startIndex; for (HandlerDescriptor.ParameterDescriptor parameter : descriptor.getParameters()) { final Class parameterType = parameter.getParameterClass(); if (parameter.isEventParameter()) { mv.visitVarInsn(ALOAD, 1); } else { mv.visitVarInsn(ALOAD, index++); if (parameterType.isPrimitive()) { if (boolean.class.equals(parameterType)) { mv.visitTypeInsn(CHECKCAST, getInternalName(Boolean.class)); mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Boolean.class), "booleanValue", "()Z", false); } else if (byte.class.equals(parameterType)) { mv.visitTypeInsn(CHECKCAST, getInternalName(Byte.class)); mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Byte.class), "byteValue", "()B", false); } else if (short.class.equals(parameterType)) { mv.visitTypeInsn(CHECKCAST, getInternalName(Short.class)); mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Short.class), "shortValue", "()S", false); } else if (int.class.equals(parameterType)) { mv.visitTypeInsn(CHECKCAST, getInternalName(Integer.class)); mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Integer.class), "intValue", "()I", false); } else if (long.class.equals(parameterType)) { mv.visitTypeInsn(CHECKCAST, getInternalName(Long.class)); mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Long.class), "longValue", "()J", false); } else if (float.class.equals(parameterType)) { mv.visitTypeInsn(CHECKCAST, getInternalName(Float.class)); mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Float.class), "floatValue", "()F", false); } else if (double.class.equals(parameterType)) { mv.visitTypeInsn(CHECKCAST, getInternalName(Double.class)); mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Double.class), "doubleValue", "()D", false); } } else { mv.visitTypeInsn(CHECKCAST, parameter.getParameterInternalName()); } } } // At last call the handler. mv.visitMethodInsn(INVOKEVIRTUAL, targetDescriptor.getTargetInternalName(), descriptor.getMethodName(), descriptor.getMethodDescriptor(), false); mv.visitLabel(endHandler); } mv.visitLabel(endEvenType); } mv.visitLabel(endMethod); mv.visitInsn(RETURN); mv.visitMaxs(0, 0); mv.visitEnd(); } { // accepts final MethodVisitor mv = classWriter.visitMethod(ACC_PUBLIC, "accepts", "(Ljava/lang/Class;)Z", null, null); mv.visitCode(); for (Class<?> eventType : targetDescriptor.getEventTypeSet()) { final Label endIf = new Label(); mv.visitLdcInsn(getType(eventType)); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Class.class), "isAssignableFrom", "(Ljava/lang/Class;)Z", false); mv.visitJumpInsn(IFEQ, endIf); mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); mv.visitLabel(endIf); } mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); mv.visitMaxs(0, 0); mv.visitEnd(); } try { final File parentFile = classFile.getParentFile(); if (!parentFile.exists()) { if (!parentFile.mkdirs()) { throw new IOException("Failed to create output directory: " + parentFile.getAbsolutePath()); } } DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(classFile)); dataOutputStream.write(classWriter.toByteArray()); dataOutputStream.flush(); dataOutputStream.close(); } catch (IOException e) { log.error("Saving dispatcher class failed!", e); } try { Class<? extends EventDispatcher> eventDispatcherClass = (Class<? extends EventDispatcher>) new URLClassLoader( new URL[] { myOutputDirectory.toURI().toURL() }, getClass().getClassLoader()) .loadClass(className); targetDescriptor.eventDispatcher = eventDispatcherClass.newInstance(); log.info("Created EventDispatcher for: '{}'. EventDispatcher class stored in: '{}' ", target, classFile.getAbsolutePath()); } catch (ClassNotFoundException | MalformedURLException | InstantiationException | IllegalAccessException e) { e.printStackTrace(); } }
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;/*from w w w .ja va 2 s .co m*/ 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;//from w ww. j a va2s .c om 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;//from w w w .j av a 2 s . c o 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 ww . j ava 2 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(); }
From source file:org.jboss.byteman.agent.JigsawAccessEnablerGenerator.java
License:Open Source License
private static byte[] getJigsawAccessibleFieldSetterClassBytes() { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); FieldVisitor fv;//from w ww .j a va2s . c o m MethodVisitor mv; cw.visit(V9, ACC_PUBLIC + ACC_SUPER, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter", null, "java/lang/Object", new String[] { "org/jboss/byteman/agent/AccessibleFieldSetter" }); 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(); } { fv = cw.visitField(ACC_PRIVATE, "field", "Ljava/lang/reflect/Field;", 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/JigsawAccessibleFieldSetter", "isStatic", "Z"); mv.visitLabel(l0); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter", "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", "findStaticSetter", "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;", false); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter", "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", "findSetter", "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;", false); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter", "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("JigsawAccessibleFieldSetter : exception creating etter 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, "set", "(Ljava/lang/Object;Ljava/lang/Object;)V", null, null); mv.visitCode(); Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Throwable"); mv.visitLabel(l0); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter", "isStatic", "Z"); Label l3 = new Label(); mv.visitJumpInsn(IFEQ, l3); mv.visitVarInsn(ALOAD, 1); Label l4 = new Label(); mv.visitJumpInsn(IFNULL, l4); mv.visitTypeInsn(NEW, "org/jboss/byteman/rule/exception/ExecuteException"); mv.visitInsn(DUP); mv.visitLdcInsn("JigsawAccessibleFieldSetter.set : expecting null owner for static set!"); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/rule/exception/ExecuteException", "<init>", "(Ljava/lang/String;)V", false); mv.visitInsn(ATHROW); mv.visitLabel(l4); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter", "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, 2); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeWithArguments", "([Ljava/lang/Object;)Ljava/lang/Object;", false); mv.visitInsn(POP); mv.visitJumpInsn(GOTO, l1); mv.visitLabel(l3); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter", "handle", "Ljava/lang/invoke/MethodHandle;"); mv.visitInsn(ICONST_2); mv.visitTypeInsn(ANEWARRAY, "java/lang/Object"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_1); mv.visitVarInsn(ALOAD, 2); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeWithArguments", "([Ljava/lang/Object;)Ljava/lang/Object;", false); mv.visitInsn(POP); mv.visitLabel(l1); Label l5 = new Label(); mv.visitJumpInsn(GOTO, l5); mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 3); mv.visitTypeInsn(NEW, "org/jboss/byteman/rule/exception/ExecuteException"); mv.visitInsn(DUP); mv.visitLdcInsn("JigsawAccessibleFieldSetter.set : exception invoking setter 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.visitLabel(l5); mv.visitInsn(RETURN); mv.visitMaxs(5, 4); mv.visitEnd(); } cw.visitEnd(); return cw.toByteArray(); }
From source file:org.jboss.byteman.rule.compiler.Compiler.java
License:Open Source License
private static byte[] compileBytes(Rule rule, Class helperClass, String helperName, String compiledHelperName, boolean compileToBytecode) throws Exception { ClassWriter cw = new ClassWriter(0); FieldVisitor fv;/* w ww. jav a 2 s. c o m*/ MethodVisitor mv; AnnotationVisitor av0; // create the class as a subclass of the rule helper class, appending Compiled to the front // of the class name and a unique number to the end of the class helperName // also ensure it implements the HelperAdapter interface // // public class foo.bar.Compiled_<helper>_<NNN> extends foo.bar.<helper> implements HelperAdapter cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, compiledHelperName, null, helperName, new String[] { "org/jboss/byteman/rule/helper/HelperAdapter" }); // we need to install the source file name { String fullFileName = rule.getFile(); int idx = fullFileName.lastIndexOf(java.io.File.separatorChar); String basicFileName = (idx < 0 ? fullFileName : fullFileName.substring(idx + 1)); String debug = "// compiled from: " + fullFileName + "\n// generated by Byteman\n"; cw.visitSource(basicFileName, debug); } { // we need a Hashmap field to hold the bindings // // private HashMap<String, Object> bindingMap; fv = cw.visitField(ACC_PRIVATE, "bindingMap", "Ljava/util/HashMap;", "Ljava/util/HashMap<Ljava/lang/String;Ljava/lang/Object;>;", null); fv.visitEnd(); } { // and a rule field to hold the rule // // private Rule rule; fv = cw.visitField(ACC_PRIVATE, "rule", "Lorg/jboss/byteman/rule/Rule;", "Lorg/jboss/byteman/rule/Rule;", null); fv.visitEnd(); } { // we need a constructor which takes a Rule as argument // if the helper implements a constructor which takes a Rule as argument then we invoke it // otherwise we invoke the empty helper constructor Constructor superConstructor = null; try { superConstructor = helperClass.getDeclaredConstructor(Rule.class); } catch (NoSuchMethodException e) { // hmm, ok see if there is an empty constructor } catch (SecurityException e) { throw new CompileException("Compiler.compileBytes : unable to access constructor for helper class " + helperClass.getCanonicalName()); } boolean superWantsRule = (superConstructor != null); if (!superWantsRule) { try { superConstructor = helperClass.getDeclaredConstructor(); } catch (NoSuchMethodException e) { throw new CompileException( "Compiler.compileBytes : no valid constructor found for helper class " + helperClass.getCanonicalName()); } catch (SecurityException e) { throw new CompileException( "Compiler.compileBytes : unable to access constructor for helper class " + helperClass.getCanonicalName()); } } // // public Compiled<helper>_<NNN>()Rule rule) mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Lorg/jboss/byteman/rule/Rule;)V", null, null); mv.visitCode(); // super(); // // or // // super(Rule); if (superWantsRule) { mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, helperName, "<init>", "(Lorg/jboss/byteman/rule/Rule;)V"); } else { mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, helperName, "<init>", "()V"); } // bindingMap = new HashMap<String, Object); mv.visitVarInsn(ALOAD, 0); mv.visitTypeInsn(NEW, "java/util/HashMap"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, "java/util/HashMap", "<init>", "()V"); mv.visitFieldInsn(PUTFIELD, compiledHelperName, "bindingMap", "Ljava/util/HashMap;"); // this.rule = rule mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitFieldInsn(PUTFIELD, compiledHelperName, "rule", "Lorg/jboss/byteman/rule/Rule;"); // return; mv.visitInsn(RETURN); mv.visitMaxs(3, 2); mv.visitEnd(); } { // create the execute method // // public void execute(Bindings bindings, Object recipient, Object[] args) throws ExecuteException mv = cw.visitMethod(ACC_PUBLIC, "execute", "(Ljava/lang/Object;[Ljava/lang/Object;)V", null, new String[] { "org/jboss/byteman/rule/exception/ExecuteException" }); mv.visitCode(); // if (Transformer.isVerbose()) mv.visitMethodInsn(INVOKESTATIC, "org/jboss/byteman/agent/Transformer", "isVerbose", "()Z"); Label l0 = new Label(); mv.visitJumpInsn(IFEQ, l0); // then // System.out.println(rule.getName() + " execute"); mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitTypeInsn(NEW, "java/lang/StringBuilder"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, compiledHelperName, "rule", "Lorg/jboss/byteman/rule/Rule;"); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Rule", "getName", "()Ljava/lang/String;"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;"); mv.visitLdcInsn(" execute()"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V"); // end if mv.visitLabel(l0); Bindings bindings = rule.getBindings(); Iterator<Binding> iterator = bindings.iterator(); while (iterator.hasNext()) { Binding binding = iterator.next(); String name = binding.getName(); if (binding.isAlias()) { // lookups and updates will use the aliased name continue; } if (binding.isHelper()) { // bindingMap.put(name, this); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, compiledHelperName, "bindingMap", "Ljava/util/HashMap;"); mv.visitLdcInsn(name); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/HashMap", "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); mv.visitInsn(POP); } else if (binding.isRecipient()) { // bindingMap.put(name, recipient); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, compiledHelperName, "bindingMap", "Ljava/util/HashMap;"); mv.visitLdcInsn(name); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/HashMap", "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); mv.visitInsn(POP); // } else if (binding.isParam() || binding.isLocalVar() || binding.isReturn() || // binding.isThrowable() || binding.isParamCount() || binding.isParamArray()) { } else if (!binding.isBindVar()) { // bindingMap.put(name, args[binding.getCallArrayIndex()]); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, compiledHelperName, "bindingMap", "Ljava/util/HashMap;"); mv.visitLdcInsn(name); mv.visitVarInsn(ALOAD, 2); mv.visitLdcInsn(binding.getCallArrayIndex()); mv.visitInsn(AALOAD); mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/HashMap", "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); mv.visitInsn(POP); } } // execute0() mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, compiledHelperName, "execute0", "()V"); // now restore update bindings iterator = bindings.iterator(); while (iterator.hasNext()) { Binding binding = iterator.next(); if (binding.isAlias()) { continue; } String name = binding.getName(); if (binding.isUpdated()) { // if (binding.isParam() || binding.isLocalVar() || binding.isReturn()) { if (!binding.isBindVar()) { int idx = binding.getCallArrayIndex(); // Object value = bindingMap.get(name); // args[idx] = value; mv.visitVarInsn(ALOAD, 2); // args mv.visitLdcInsn(idx); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, compiledHelperName, "bindingMap", "Ljava/util/HashMap;"); mv.visitLdcInsn(name); mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/HashMap", "get", "(Ljava/lang/Object;)Ljava/lang/Object;"); mv.visitInsn(AASTORE); } } } // return mv.visitInsn(RETURN); mv.visitMaxs(4, 3); mv.visitEnd(); } { // create the setBinding method // // public void setBinding(String name, Object value) mv = cw.visitMethod(ACC_PUBLIC, "setBinding", "(Ljava/lang/String;Ljava/lang/Object;)V", null, null); mv.visitCode(); // bindingMap.put(name, value); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, compiledHelperName, "bindingMap", "Ljava/util/HashMap;"); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/HashMap", "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); mv.visitInsn(POP); // return mv.visitInsn(RETURN); mv.visitMaxs(3, 3); mv.visitEnd(); } { // create the getBinding method // // public Object getBinding(String name) mv = cw.visitMethod(ACC_PUBLIC, "getBinding", "(Ljava/lang/String;)Ljava/lang/Object;", null, null); mv.visitCode(); // {TOS} <== bindingMap.get(name); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, compiledHelperName, "bindingMap", "Ljava/util/HashMap;"); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/HashMap", "get", "(Ljava/lang/Object;)Ljava/lang/Object;"); // return {TOS} mv.visitInsn(ARETURN); mv.visitMaxs(2, 2); mv.visitEnd(); } { // create the getName method // // public String getName() mv = cw.visitMethod(ACC_PUBLIC, "getName", "()Ljava/lang/String;", null, null); mv.visitCode(); // {TOS} <== rule.getName() mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, compiledHelperName, "rule", "Lorg/jboss/byteman/rule/Rule;"); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Rule", "getName", "()Ljava/lang/String;"); // return {TOS} mv.visitInsn(ARETURN); mv.visitMaxs(1, 1); mv.visitEnd(); } // create the getAccessibleField method // // public Object getAccessibleField(Object owner, int fieldIndex) { mv = cw.visitMethod(ACC_PUBLIC, "getAccessibleField", "(Ljava/lang/Object;I)Ljava/lang/Object;", null, null); mv.visitCode(); // {TOS} <== rule.getAccessibleField(owner, fieldIndex); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, compiledHelperName, "rule", "Lorg/jboss/byteman/rule/Rule;"); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ILOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Rule", "getAccessibleField", "(Ljava/lang/Object;I)Ljava/lang/Object;"); // return {TOS} mv.visitInsn(ARETURN); mv.visitMaxs(3, 3); mv.visitEnd(); } // create the setAccessibleField method // // public void setAccessibleField(Object owner, Object value, int fieldIndex) // rule.setAccessibleField(owner, value, fieldIndex); { mv = cw.visitMethod(ACC_PUBLIC, "setAccessibleField", "(Ljava/lang/Object;Ljava/lang/Object;I)V", null, null); mv.visitCode(); // rule.setAccessibleField(owner, value, fieldIndex); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, compiledHelperName, "rule", "Lorg/jboss/byteman/rule/Rule;"); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ILOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Rule", "setAccessibleField", "(Ljava/lang/Object;Ljava/lang/Object;I)V"); // return mv.visitInsn(RETURN); mv.visitMaxs(4, 4); mv.visitEnd(); } // create the invokeAccessibleMethod method // // public Object invokeAccessibleMethod(Object target, Object[] args, int methodIndex) // {TOS} <== rule.invokeAccessibleMethod(target, args, methodIndex); { mv = cw.visitMethod(ACC_PUBLIC, "invokeAccessibleMethod", "(Ljava/lang/Object;[Ljava/lang/Object;I)Ljava/lang/Object;", null, null); mv.visitCode(); // rule.invokeAccessibleMethod(target, args, fieldIndex); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, compiledHelperName, "rule", "Lorg/jboss/byteman/rule/Rule;"); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ILOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Rule", "invokeAccessibleMethod", "(Ljava/lang/Object;[Ljava/lang/Object;I)Ljava/lang/Object;"); // return {TOS} mv.visitInsn(ARETURN); mv.visitMaxs(4, 4); mv.visitEnd(); } if (compileToBytecode) { // we generate a single execute0 method if we want to run compiled and get // the event, condiiton and action to insert the relevant bytecode to implement // bind(), test() and fire() { // create the execute0() method // // private void execute0() mv = cw.visitMethod(ACC_PRIVATE, "execute0", "()V", null, new String[] { "org/jboss/byteman/rule/exception/ExecuteException" }); mv.visitCode(); CompileContext compileContext = new CompileContext(mv); // make sure we set the first line number before generating any code compileContext.notifySourceLine(rule.getLine()); compileContext.addLocalCount(3); // for this and 2 object args // bind(); rule.getEvent().compile(mv, compileContext); // if (test()) rule.getCondition().compile(mv, compileContext); Label l0 = new Label(); mv.visitJumpInsn(IFEQ, l0); compileContext.addStackCount(-1); // then rule.getAction().compile(mv, compileContext); // fire(); // end if mv.visitLabel(l0); // this will match the ENDRULE line compileContext.notifySourceEnd(); // return mv.visitInsn(RETURN); // need to specify correct Maxs values mv.visitMaxs(compileContext.getStackMax(), compileContext.getLocalMax()); mv.visitEnd(); } } else { // we generate the following methods if we want to run interpreted { // create the execute0() method // // private void execute0() mv = cw.visitMethod(ACC_PRIVATE, "execute0", "()V", null, new String[] { "org/jboss/byteman/rule/exception/ExecuteException" }); mv.visitCode(); // bind(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, compiledHelperName, "bind", "()V"); // if (test()) mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, compiledHelperName, "test", "()Z"); Label l0 = new Label(); mv.visitJumpInsn(IFEQ, l0); // then // fire(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, compiledHelperName, "fire", "()V"); // end if mv.visitLabel(l0); // return mv.visitInsn(RETURN); mv.visitMaxs(1, 1); mv.visitEnd(); } { // create the bind method // // private void bind() mv = cw.visitMethod(ACC_PRIVATE, "bind", "()V", null, new String[] { "org/jboss/byteman/rule/exception/ExecuteException" }); mv.visitCode(); // rule.getEvent().interpret(this); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, compiledHelperName, "rule", "Lorg/jboss/byteman/rule/Rule;"); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Rule", "getEvent", "()Lorg/jboss/byteman/rule/Event;"); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Event", "interpret", "(Lorg/jboss/byteman/rule/helper/HelperAdapter;)Ljava/lang/Object;"); mv.visitInsn(RETURN); mv.visitMaxs(2, 1); mv.visitEnd(); } { // create the test method // // private boolean test() mv = cw.visitMethod(ACC_PRIVATE, "test", "()Z", null, new String[] { "org/jboss/byteman/rule/exception/ExecuteException" }); mv.visitCode(); // {TOS} <== rule.getCondition().interpret(this); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, compiledHelperName, "rule", "Lorg/jboss/byteman/rule/Rule;"); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Rule", "getCondition", "()Lorg/jboss/byteman/rule/Condition;"); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Condition", "interpret", "(Lorg/jboss/byteman/rule/helper/HelperAdapter;)Ljava/lang/Object;"); mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Boolean"); // unbox the returned Boolean mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z"); // return {TOS} mv.visitInsn(IRETURN); mv.visitMaxs(2, 1); mv.visitEnd(); } { // create the fire method // // private void fire() mv = cw.visitMethod(ACC_PRIVATE, "fire", "()V", null, new String[] { "org/jboss/byteman/rule/exception/ExecuteException" }); mv.visitCode(); // rule.getAction().interpret(this); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, compiledHelperName, "rule", "Lorg/jboss/byteman/rule/Rule;"); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Rule", "getAction", "()Lorg/jboss/byteman/rule/Action;"); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/rule/Action", "interpret", "(Lorg/jboss/byteman/rule/helper/HelperAdapter;)Ljava/lang/Object;"); // return mv.visitInsn(RETURN); mv.visitMaxs(2, 1); mv.visitEnd(); } } cw.visitEnd(); return cw.toByteArray(); }