org.objectweb.asm.ClassWriter#visit ( )源码实例Demo

下面列出了org.objectweb.asm.ClassWriter#visit ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。

源代码1 项目: turbine   文件: MainTest.java
public static byte[] dump() {
  ClassWriter classWriter = new ClassWriter(0);
  classWriter.visit(
      Opcodes.V1_8,
      Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER,
      "g/Gen",
      null,
      "java/lang/Object",
      null);
  {
    MethodVisitor methodVisitor =
        classWriter.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
    methodVisitor.visitCode();
    methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
    methodVisitor.visitMethodInsn(
        Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
    methodVisitor.visitInsn(Opcodes.RETURN);
    methodVisitor.visitMaxs(1, 1);
    methodVisitor.visitEnd();
  }
  classWriter.visitEnd();
  return classWriter.toByteArray();
}
 
源代码2 项目: we-cmdb   文件: DynamicEntityGenerator.java
private static void writeClass(String classDesc, String tabelName, String className, ClassWriter classWriter) {
    AnnotationVisitor annotationVisitor0;
    classWriter.visit(V1_8, ACC_PUBLIC | ACC_SUPER, classDesc, null, "java/lang/Object", new String[] { "java/io/Serializable" });

    annotationVisitor0 = classWriter.visitAnnotation("Ljavax/persistence/Entity;", true);
    annotationVisitor0.visitEnd();

    annotationVisitor0 = classWriter.visitAnnotation("Ljavax/persistence/Table;", true);
    annotationVisitor0.visit("name", tabelName);
    annotationVisitor0.visitEnd();

    annotationVisitor0 = classWriter.visitAnnotation("Ljavax/persistence/NamedQuery;", true);
    annotationVisitor0.visit("name", className + ".findAll");
    annotationVisitor0.visit("query", "SELECT a FROM " + className + " a");
    annotationVisitor0.visitEnd();
}
 
源代码3 项目: jackson-modules-base   文件: MyClassLoaderTest.java
/**
 * Create simple stub bytecode for a class with only a no-arg constructor.
 *
 * @param baseName      the base class name for the new class
 * @param superClass    the superclass from which the new class should extend
 * @return              the bytecode for a new class
 */
private static byte[] generateTestClassByteCode(ClassName baseName, Class<?> superClass) {
    final String tmpClassName = baseName.getSlashedTemplate();
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    String superClassName = superClass.getName().replace(".", "/");

    cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER + ACC_FINAL, tmpClassName, null, superClassName, null);
    cw.visitSource(baseName.getSourceFilename(), null);

    // default (no-arg) constructor:
    MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, superClassName, "<init>", "()V", false);
    mv.visitInsn(RETURN);
    mv.visitMaxs(0, 0);
    mv.visitEnd();

    cw.visitEnd();
    return cw.toByteArray();
}
 
源代码4 项目: Concurnas   文件: ClassRefInterfaceGennerator.java
private static byte[] create(String name, LinkedHashSet<String> constructors, String superclass) throws Exception {

		ClassWriter cw = new ClassWriter(0);
		MethodVisitor mv;

		cw.visit(V1_8, ACC_PUBLIC + ACC_ABSTRACT + ACC_INTERFACE, name, null, "java/lang/Object", superclass==null?null:new String[]{FuncType.classRefIfacePrefix  +superclass +  FuncType.classRefIfacePostfix });
		for(String desc: constructors){
			
			desc = desc.substring(0, desc.lastIndexOf("V")) + "Ljava/lang/Object;";
			
			mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "apply", desc, null, null);
			mv.visitEnd();
		}
		cw.visitEnd();

		return cw.toByteArray();
	}
 
源代码5 项目: caravan   文件: AsmTest.java
@Test
public void test() {
  ClassWriter cw = new ClassWriter(0);
  cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, "HelloGen", null, "java/lang/Object", null);

  FieldVisitor fv = cw.visitField(1, "_key", Type.getDescriptor(String.class), null, null);
  fv.visitEnd();

  fv = cw.visitField(1, "_value", Type.getDescriptor(InnerClass.class), null, null);
  fv.visitEnd();

  Class<?> clazz = new DynamicClassLoader().defineClass("HelloGen", cw.toByteArray());
  for(Field f : clazz.getDeclaredFields()) {
    System.out.println(f.getName());
  }
}
 
源代码6 项目: AVM   文件: CreateTest.java
private byte[] getByteCodeForClassWithoutSuperName() {
    ClassWriter classWriter = new ClassWriter(0);
    MethodVisitor methodVisitor;

    classWriter.visit(V10, ACC_PUBLIC | ACC_SUPER, "b/Main", null, null, null);

    classWriter.visitSource("Main.java", null);
    {
        methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        methodVisitor.visitCode();
        Label label0 = new Label();
        methodVisitor.visitLabel(label0);
        methodVisitor.visitLineNumber(3, label0);
        methodVisitor.visitVarInsn(ALOAD, 0);
        methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        methodVisitor.visitInsn(RETURN);
        methodVisitor.visitMaxs(1, 1);
        methodVisitor.visitEnd();
    }
    classWriter.visitEnd();

    return classWriter.toByteArray();
}
 
源代码7 项目: shrinker   文件: WriteStyleablesProcessor.java
@Override
public void proceed() {
    ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    writer.visit(Opcodes.V1_6,
            Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC | Opcodes.ACC_SUPER,
            RSymbols.R_STYLEABLES_CLASS_NAME,
            null,
            "java/lang/Object",
            null);
    for (String name : symbols.getStyleables().keySet()) {
        writer.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL, name, "[I", null, null);
    }

    writeClinit(writer);
    writer.visitEnd();
    byte[] bytes = writer.toByteArray();
    try {
        if (!dir.isDirectory() && !dir.mkdirs()) {
            throw new RuntimeException("Cannot mkdir " + dir);
        }
        Files.write(dir.toPath().resolve(RSymbols.R_STYLEABLES_CLASS_NAME + ".class"), bytes);
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
}
 
源代码8 项目: lucene-solr   文件: TestCustomFunctions.java
public Class<?> createFakeClass() {
  String className = TestCustomFunctions.class.getName() + "$Foo";
  ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
  classWriter.visit(Opcodes.V1_5, ACC_PUBLIC | ACC_SUPER | ACC_FINAL | ACC_SYNTHETIC,
      className.replace('.', '/'), null, Type.getInternalName(Object.class), null);
  
  org.objectweb.asm.commons.Method m = org.objectweb.asm.commons.Method.getMethod("void <init>()");
  GeneratorAdapter constructor = new GeneratorAdapter(ACC_PRIVATE | ACC_SYNTHETIC, m, null, null, classWriter);
  constructor.loadThis();
  constructor.loadArgs();
  constructor.invokeConstructor(Type.getType(Object.class), m);
  constructor.returnValue();
  constructor.endMethod();
  
  GeneratorAdapter gen = new GeneratorAdapter(ACC_STATIC | ACC_PUBLIC | ACC_SYNTHETIC,
      org.objectweb.asm.commons.Method.getMethod("double bar()"), null, null, classWriter);
  gen.push(2.0);
  gen.returnValue();
  gen.endMethod();      
  
  byte[] bc = classWriter.toByteArray();
  return defineClass(className, bc, 0, bc.length);
}
 
源代码9 项目: AVM   文件: InterfaceFieldClassGeneratorTest.java
public static byte[] getInnerFILEDSInterfaceBytes() {
    ClassWriter classWriter = new ClassWriter(0);
    MethodVisitor methodVisitor;

    classWriter.visit(V10, ACC_PUBLIC | ACC_SUPER, "NestedInterfaces", null, "java/lang/Object", null);

    classWriter.visitSource("NestedInterfaces.java", null);

    classWriter.visitInnerClass("NestedInterfaces$FIELDS", "NestedInterfaces", "FIELDS", ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE);

    classWriter.visitInnerClass("NestedInterfaces$FIELDS$FIELDS", "NestedInterfaces$FIELDS", "FIELDS", ACC_PUBLIC | ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE);

    {
        methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        methodVisitor.visitCode();
        Label label0 = new Label();
        methodVisitor.visitLabel(label0);
        methodVisitor.visitLineNumber(3, label0);
        methodVisitor.visitVarInsn(ALOAD, 0);
        methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        methodVisitor.visitInsn(RETURN);
        methodVisitor.visitMaxs(1, 1);
        methodVisitor.visitEnd();
    }
    classWriter.visitEnd();

    return classWriter.toByteArray();
}
 
源代码10 项目: glowroot   文件: AdviceGenerator.java
@RequiresNonNull("methodMetaInternalName")
private LazyDefinedClass generateMethodMetaClass(InstrumentationConfig config) {
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
    cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, methodMetaInternalName, null, "java/lang/Object",
            null);
    cw.visitField(ACC_PRIVATE + ACC_FINAL, "messageTemplate",
            "Lorg/glowroot/agent/bytecode/api/MessageTemplate;", null, null).visitEnd();
    if (!config.transactionNameTemplate().isEmpty()) {
        cw.visitField(ACC_PRIVATE + ACC_FINAL, "transactionNameTemplate",
                "Lorg/glowroot/agent/bytecode/api/MessageTemplate;", null, null).visitEnd();
    }
    if (!config.transactionUserTemplate().isEmpty()) {
        cw.visitField(ACC_PRIVATE + ACC_FINAL, "transactionUserTemplate",
                "Lorg/glowroot/agent/bytecode/api/MessageTemplate;", null, null).visitEnd();
    }
    for (int i = 0; i < config.transactionAttributeTemplates().size(); i++) {
        cw.visitField(ACC_PRIVATE + ACC_FINAL, "transactionAttributeTemplate" + i,
                "Lorg/glowroot/agent/bytecode/api/MessageTemplate;", null, null).visitEnd();
    }
    generateMethodMetaConstructor(cw);
    generateMethodMetaGetter(cw, "messageTemplate", "getMessageTemplate");
    if (!config.transactionNameTemplate().isEmpty()) {
        generateMethodMetaGetter(cw, "transactionNameTemplate", "getTransactionNameTemplate");
    }
    if (!config.transactionUserTemplate().isEmpty()) {
        generateMethodMetaGetter(cw, "transactionUserTemplate", "getTransactionUserTemplate");
    }
    for (int i = 0; i < config.transactionAttributeTemplates().size(); i++) {
        generateMethodMetaGetter(cw, "transactionAttributeTemplate" + i,
                "getTransactionAttributeTemplate" + i);
    }
    cw.visitEnd();
    return ImmutableLazyDefinedClass.builder()
            .type(Type.getObjectType(methodMetaInternalName))
            .bytes(cw.toByteArray())
            .build();
}
 
源代码11 项目: android-perftracking   文件: ClassGenerator.java
/**
 * Creates AppPerformanceConfig.class file with a static boolean field AppPerformanceConfig#enabled in it.
 *
 * @param value Initializes the AppPerformanceConfig#enabled with value.
 * @return byte array of the class.
 */
public static byte[] generateConfigClass(boolean value) {

  ClassWriter cw = new ClassWriter(0);
  cw.visit(V1_6, ACC_FINAL + ACC_SUPER,
      "com/rakuten/tech/mobile/perf/runtime/internal/AppPerformanceConfig", null,
      "java/lang/Object", null);
  cw.visitField(ACC_PUBLIC + ACC_STATIC, "enabled", "Z", null, value);
  cw.visitEnd();
  return cw.toByteArray();
}
 
源代码12 项目: glowroot   文件: AdviceGenerator.java
private LazyDefinedClass generate() {
    LazyDefinedClass methodMetaClass = null;
    if (methodMetaInternalName != null) {
        methodMetaClass = generateMethodMetaClass(config);
    }
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
    String[] interfaces = null;
    if (!config.enabledProperty().isEmpty() || !config.traceEntryEnabledProperty().isEmpty()) {
        interfaces = new String[] {"org/glowroot/agent/plugin/api/config/ConfigListener"};
    }
    cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, adviceInternalName, null, "java/lang/Object",
            interfaces);
    addClassAnnotation(cw);
    addStaticFields(cw);
    addStaticInitializer(cw);
    boolean checkNotInTransaction = config.isTransaction()
            && config.alreadyInTransactionBehavior() == AlreadyInTransactionBehavior.DO_NOTHING;
    boolean checkPropertyNotEnabled = pluginId != null && !config.enabledProperty().isEmpty();
    addIsEnabledMethodIfNeeded(cw, checkNotInTransaction, checkPropertyNotEnabled);
    if (config.isTraceEntryOrGreater()) {
        // methodMetaInternalName is non-null when entry or greater
        checkNotNull(methodMetaInternalName);
        addOnBeforeMethod(cw);
        addOnThrowMethod(cw);
        addOnReturnMethod(cw);
    } else if (config.captureKind() == CaptureKind.TIMER) {
        addOnBeforeMethodTimerOnly(cw);
        addOnAfterMethodTimerOnly(cw);
    } else {
        addOnBeforeMethodOther(cw);
    }
    cw.visitEnd();
    ImmutableLazyDefinedClass.Builder builder = ImmutableLazyDefinedClass.builder()
            .type(Type.getObjectType(adviceInternalName))
            .bytes(cw.toByteArray());
    if (methodMetaClass != null) {
        builder.addDependencies(methodMetaClass);
    }
    return builder.build();
}
 
源代码13 项目: spring-boot-netty   文件: AbstractMethodInvoker.java
final <T extends InvokerBase> T buildInvoker(final Class<?> parent, final Method targetMethod, final Method invokerMethod,
                                             final boolean sendResult, final MethodPrefixAssembler prefixAssembler) {

    final String packageName = parent.getPackage().getName();
    final String invokerClassName = packageName + ".DynamicInvoker$$GeneratedClass$$" + COUNTER.getAndIncrement();

    final String invokerInternalName = invokerClassName.replace('.', '/');
    final String parentInternalName = Type.getInternalName(parent);

    final ClassWriter cw = new ClassWriter(COMPUTE_MAXS);
    cw.visit(V1_8, ACC_SUPER | ACC_PUBLIC, invokerInternalName, null, parentInternalName, EMPTY_INTERFACES);

    final Type invokerType = Type.getObjectType(invokerInternalName);
    final String invokerDescriptor = invokerType.getDescriptor();

    assembleConstructor(invokerType, parentInternalName, cw);
    assembleMethodHandleField(cw, targetMethod, invokerInternalName);
    assembleInvokerMethod(cw, invokerDescriptor, invokerInternalName, invokerMethod, targetMethod, sendResult, prefixAssembler);

    cw.visitEnd();

    final byte[] bytecode = cw.toByteArray();
    final Class<T> cl = CLASS_LOADER.load(bytecode, invokerClassName);

    try {
        return cl.getDeclaredConstructor().newInstance();
    } catch (final IllegalAccessException | InstantiationException | InvocationTargetException | NoSuchMethodException e) {
        throw new IllegalStateException(e);
    }
}
 
源代码14 项目: JCTools   文件: ProxyChannelFactory.java
/**
 * Create a proxy channel using a user supplied back end.
 * 
 * @param capacity
 *            The minimum capacity for unprocessed invocations the channel
 *            should support
 * @param iFace
 *            Interface the proxy must implement
 * @param waitStrategy
 *            A wait strategy to be invoked when the backing data structure
 *            is full
 * @param backendType
 *            The back end type, the proxy will inherit from this channel
 *            type. The back end type must define a constructor with signature:
 *            <code>(int capacity, int primitiveMessageSize, int referenceMessageSize)</code>
 * @return A proxy channel instance
 */
public static <E> ProxyChannel<E> createProxy(int capacity, 
        Class<E> iFace, 
        WaitStrategy waitStrategy,
        Class<? extends ProxyChannelRingBuffer> backendType) {
    if (!iFace.isInterface()) {
        throw new IllegalArgumentException("Not an interface: " + iFace);
    }
    
    

    String generatedName = Type.getInternalName(iFace) + "$JCTools$ProxyChannel$" + backendType.getSimpleName();
    Class<?> preExisting = findExisting(generatedName, iFace);
    if (preExisting != null) {
        return instantiate(preExisting, capacity, waitStrategy);
    }

    List<Method> relevantMethods = findRelevantMethods(iFace);
    if (relevantMethods.isEmpty()) {
        throw new IllegalArgumentException("Does not declare any abstract methods: " + iFace);
    }

    // max number of reference arguments of any method
    int referenceMessageSize = 0;
    // max bytes required to store the primitive args of a call frame of any method
    int primitiveMessageSize = 0;
    
    for (Method method : relevantMethods) {
        int primitiveMethodSize = 0;
        int referenceCount = 0;
        for (Class<?> parameterType : method.getParameterTypes()) {
            if (parameterType.isPrimitive()) {
                primitiveMethodSize += primitiveMemorySize(parameterType);
            } else {
                referenceCount++;
            }
        }
        primitiveMessageSize = Math.max(primitiveMessageSize, primitiveMethodSize);
        referenceMessageSize = Math.max(referenceMessageSize, referenceCount);
    }
    
    // We need to add an int to this for the 'type' value on the message frame
    primitiveMessageSize += primitiveMemorySize(int.class);
    
    ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);

    classWriter.visit(Opcodes.V1_4,
            Opcodes.ACC_SYNTHETIC | Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL,
            generatedName,
            null,
            Type.getInternalName(backendType),
            new String[]{Type.getInternalName(ProxyChannel.class), Type.getInternalName(iFace)});
    implementInstanceFields(classWriter);
    implementConstructor(classWriter, backendType, generatedName, primitiveMessageSize, referenceMessageSize);
    implementProxyInstance(classWriter, iFace, generatedName);
    implementProxy(classWriter, iFace, generatedName);

    implementUserMethods(classWriter, relevantMethods, generatedName, backendType);
    implementProcess(classWriter, backendType, relevantMethods, iFace, generatedName);

    classWriter.visitEnd();

    synchronized (ProxyChannelFactory.class) {
        preExisting = findExisting(generatedName, iFace);
        if (preExisting != null) {
            return instantiate(preExisting, capacity, waitStrategy);
        }
        byte[] byteCode = classWriter.toByteArray();
        printClassBytes(byteCode);
        // Caveat: The interface and JCTools must be on the same class loader. Maybe class loader should be an argument? Overload?
        Class<?> definedClass = UnsafeAccess.UNSAFE.defineClass(generatedName, byteCode, 0, byteCode.length, iFace.getClassLoader(), null);
        return instantiate(definedClass, capacity, waitStrategy);
    }
}
 
private <T extends Script> Class<? extends T> generateEmptyScriptClass(Class<T> type) {
    ClassWriter visitor = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    String typeName = type.getName() + "_Decorated";
    Type generatedType = Type.getType("L" + typeName.replaceAll("\\.", "/") + ";");
    Type superclassType = Type.getType(type);
    visitor.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, generatedType.getInternalName(), null,
            superclassType.getInternalName(), new String[0]);

    // Constructor

    String constructorDescriptor = Type.getMethodDescriptor(Type.VOID_TYPE, new Type[0]);
    MethodVisitor methodVisitor = visitor.visitMethod(Opcodes.ACC_PUBLIC, "<init>", constructorDescriptor, null,
            new String[0]);
    methodVisitor.visitCode();

    // super()
    methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
    methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, superclassType.getInternalName(), "<init>",
            constructorDescriptor);

    methodVisitor.visitInsn(Opcodes.RETURN);
    methodVisitor.visitMaxs(0, 0);
    methodVisitor.visitEnd();

    // run() method

    String runDesciptor = Type.getMethodDescriptor(Type.getType(Object.class), new Type[0]);
    methodVisitor = visitor.visitMethod(Opcodes.ACC_PUBLIC, "run", runDesciptor, null, new String[0]);
    methodVisitor.visitCode();

    // return null
    methodVisitor.visitInsn(Opcodes.ACONST_NULL);

    methodVisitor.visitInsn(Opcodes.ARETURN);
    methodVisitor.visitMaxs(0, 0);
    methodVisitor.visitEnd();

    visitor.visitEnd();

    byte[] bytecode = visitor.toByteArray();
    JavaMethod<ClassLoader, Class> method = JavaReflectionUtil.method(ClassLoader.class, Class.class, "defineClass", String.class, byte[].class, int.class, int.class);
    @SuppressWarnings("unchecked")
    Class<T> clazz = method.invoke(type.getClassLoader(), typeName, bytecode, 0, bytecode.length);
    return clazz;
}
 
源代码16 项目: turbine   文件: LowerTest.java
@Test
public void invalidConstants() throws Exception {
  Path lib = temporaryFolder.newFile("lib.jar").toPath();
  try (OutputStream os = Files.newOutputStream(lib);
      JarOutputStream jos = new JarOutputStream(os)) {
    jos.putNextEntry(new JarEntry("Lib.class"));

    ClassWriter cw = new ClassWriter(0);
    cw.visit(52, Opcodes.ACC_SUPER, "Lib", null, "java/lang/Object", null);
    cw.visitField(Opcodes.ACC_FINAL | Opcodes.ACC_STATIC, "ZCONST", "Z", null, Integer.MAX_VALUE);
    cw.visitField(Opcodes.ACC_FINAL | Opcodes.ACC_STATIC, "SCONST", "S", null, Integer.MAX_VALUE);
    jos.write(cw.toByteArray());
  }

  ImmutableMap<String, String> input =
      ImmutableMap.of(
          "Test.java",
          Joiner.on('\n')
              .join(
                  "class Test {",
                  "  static final short SCONST = Lib.SCONST + 0;",
                  "  static final boolean ZCONST = Lib.ZCONST || false;",
                  "}"));

  Map<String, byte[]> actual = IntegrationTestSupport.runTurbine(input, ImmutableList.of(lib));

  Map<String, Object> values = new LinkedHashMap<>();
  new ClassReader(actual.get("Test"))
      .accept(
          new ClassVisitor(Opcodes.ASM7) {
            @Override
            public FieldVisitor visitField(
                int access, String name, String desc, String signature, Object value) {
              values.put(name, value);
              return super.visitField(access, name, desc, signature, value);
            }
          },
          0);

  assertThat(values).containsEntry("SCONST", -1);
  assertThat(values).containsEntry("ZCONST", 1);
}
 
源代码17 项目: bumblebench   文件: ComplexIndyGenerator.java
public static byte[] makeExample() throws Throwable {
	      ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
	      cw.visit(V1_7, ACC_PUBLIC | ACC_SUPER, "ComplexIndy", null, "java/lang/Object", null);
	      		      
	      MethodVisitor mv;
	      {
	         mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "gwtTest", "(Ljava/lang/Object;)Ljava/lang/String;", null, null);
	         mv.visitCode();
		 mv.visitVarInsn(ALOAD, 0);
	         mv.visitInvokeDynamicInsn("gwtBootstrap", "(Ljava/lang/Object;)Ljava/lang/String;",
	               new Handle(
	            		   H_INVOKESTATIC, 
	            		   "BootstrapMethods", 
	            		   "fibBootstrap",
	            		   Type.getType(
	            				 "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"
	            		   ).getDescriptor())
	         );
	         mv.visitInsn(ARETURN);
	         mv.visitMaxs(0, 0);
	         mv.visitEnd();
	      }

	{
		mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "fibIndy", "(I)I", null, null);
		mv.visitCode();
		mv.visitVarInsn(ILOAD, 0);
		mv.visitInvokeDynamicInsn("fibBootstrap", "(I)I",
			new Handle(
				H_INVOKESTATIC, 
				"BootstrapMethods", 
				"fibBootstrap",
				Type.getType(
					"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"
				).getDescriptor())
			);
		mv.visitInsn(IRETURN);
		mv.visitMaxs(0, 0);
		mv.visitEnd();
	}
cw.visitEnd();
return cw.toByteArray();
}
 
源代码18 项目: Hyperium   文件: EventSubscriber.java
private Class<?> createHandler(Method callback) {
    // ClassName$methodName_EventClass_XXX
    String name = objName + "$" + callback.getName() + "_" + callback.getParameters()[0].getType().getSimpleName() + "_" + (ID++);
    String eventType = Type.getInternalName(callback.getParameterTypes()[0]);

    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
    MethodVisitor mv;
    String desc = name.replace(".", "/");
    String instanceClassName = instance.getClass().getName().replace(".", "/");

    cw.visit(V1_6, ACC_PUBLIC | ACC_SUPER, desc, null, "java/lang/Object", new String[]{ "cc/hyperium/event/EventSubscriber$EventHandler" });

    cw.visitSource(".dynamic", null);
    {
        cw.visitField(ACC_PUBLIC, "instance", "Ljava/lang/Object;", null, null).visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Ljava/lang/Object;)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitFieldInsn(PUTFIELD, desc, "instance", "Ljava/lang/Object;");
        mv.visitInsn(RETURN);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "handle", "(Ljava/lang/Object;)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, desc, "instance", "Ljava/lang/Object;");
        mv.visitTypeInsn(CHECKCAST, instanceClassName);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitTypeInsn(CHECKCAST, eventType);
        mv.visitMethodInsn(INVOKEVIRTUAL, instanceClassName, callback.getName(), Type.getMethodDescriptor(callback), false);
        mv.visitInsn(RETURN);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    cw.visitEnd();

    byte[] handlerClassBytes = cw.toByteArray();
    return LOADER.define(name, handlerClassBytes);
}
 
源代码19 项目: beetl2.0   文件: ASMGen.java
public static byte[] dump() throws Exception {

		ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
		FieldVisitor fv;
		MethodVisitor mv;
		AnnotationVisitor av0;

		cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER,
				"com/beetl/performance/lab/asm/UserAsmAccessor1", null,
				"java/lang/Object",
				new String[] { "com/beetl/performance/lab/asm/Access" });

		{
			mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
			mv.visitCode();
			mv.visitVarInsn(ALOAD, 0);
			mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>",
					"()V");
			mv.visitInsn(RETURN);
			mv.visitMaxs(1, 1);
			mv.visitEnd();
		}
		{
			mv = cw.visitMethod(
					ACC_PUBLIC,
					"get",
					"(Ljava/lang/Object;I)Ljava/lang/Object;",
					null,
					new String[] { "com/beetl/performance/lab/asm/ASMCastException" });
			mv.visitCode();
			Label l0 = new Label();
			Label l1 = new Label();
			Label l2 = new Label();
			mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception");
			mv.visitInsn(ACONST_NULL);
			mv.visitVarInsn(ASTORE, 3);
			mv.visitLabel(l0);
			mv.visitVarInsn(ALOAD, 1);
			mv.visitTypeInsn(CHECKCAST, "com/beetl/performance/lab/User");
			mv.visitVarInsn(ASTORE, 3);
			mv.visitLabel(l1);
			Label l3 = new Label();
			mv.visitJumpInsn(GOTO, l3);
			mv.visitLabel(l2);
			mv.visitFrame(Opcodes.F_FULL, 4, new Object[] {
					"com/beetl/performance/lab/asm/UserAsmAccessor",
					"java/lang/Object", Opcodes.INTEGER,
					"com/beetl/performance/lab/User" }, 1,
					new Object[] { "java/lang/Exception" });
			mv.visitVarInsn(ASTORE, 4);
			mv.visitTypeInsn(NEW,
					"com/beetl/performance/lab/asm/ASMCastException");
			mv.visitInsn(DUP);
			mv.visitMethodInsn(INVOKESPECIAL,
					"com/beetl/performance/lab/asm/ASMCastException", "<init>",
					"()V");
			mv.visitInsn(ATHROW);
			mv.visitLabel(l3);
			mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
			mv.visitVarInsn(ILOAD, 2);
			Label l4 = new Label();
			Label l5 = new Label();
			Label l6 = new Label();
			mv.visitTableSwitchInsn(1, 2, l6, new Label[] { l4, l5 });
			mv.visitLabel(l4);
			mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
			mv.visitVarInsn(ALOAD, 3);
			mv.visitMethodInsn(INVOKEVIRTUAL, "com/beetl/performance/lab/User",
					"getName", "()Ljava/lang/String;");
			mv.visitInsn(ARETURN);
			mv.visitLabel(l5);
			mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
			mv.visitVarInsn(ALOAD, 3);
			mv.visitMethodInsn(INVOKEVIRTUAL, "com/beetl/performance/lab/User",
					"getId", "()I");
			mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf",
					"(I)Ljava/lang/Integer;");
			mv.visitInsn(ARETURN);
			mv.visitLabel(l6);
			mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
			mv.visitTypeInsn(NEW, "java/lang/RuntimeException");
			mv.visitInsn(DUP);
			mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException",
					"<init>", "()V");
			mv.visitInsn(ATHROW);
			mv.visitMaxs(2, 5);
			mv.visitEnd();
		}
		cw.visitEnd();

		return cw.toByteArray();
	}
 
源代码20 项目: ARCHIVE-wildfly-swarm   文件: ApplicationFactory.java
public static byte[] create(String name, String context) {

        ClassWriter cw = new ClassWriter(0);
        MethodVisitor mv;
        AnnotationVisitor av0;

        cw.visit(V1_7, ACC_PUBLIC + ACC_SUPER,
                name.replace('.', '/'),
                null,
                "javax/ws/rs/core/Application", null);

        int lastDot = name.lastIndexOf('.');
        String simpleName = name.substring(lastDot + 1);
        cw.visitSource(simpleName + ".java", null);

        {
            av0 = cw.visitAnnotation("Ljavax/ws/rs/ApplicationPath;", true);
            av0.visit("value", "/");
            av0.visitEnd();
        }
        {
            mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
            mv.visitCode();
            Label l0 = new Label();
            mv.visitLabel(l0);
            mv.visitLineNumber(10, l0);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKESPECIAL, "javax/ws/rs/core/Application", "<init>", "()V", false);
            mv.visitInsn(RETURN);
            Label l1 = new Label();
            mv.visitLabel(l1);
            mv.visitLocalVariable("this",
                    "L" + name.replace('.', '/') + ";",
                    null,
                    l0,
                    l1,
                    0);
            mv.visitMaxs(1, 1);
            mv.visitEnd();
        }
        cw.visitEnd();

        return cw.toByteArray();
    }