Package org.nutz.repo.org.objectweb.asm

Examples of org.nutz.repo.org.objectweb.asm.ClassWriter


  Constructor<?>[] constructors;

  ClassY(Class<?> klass, String myName, Method[] methodArray, Constructor<?>[] constructors) {
    this.myName = myName.replace('.', '/');
    this.enhancedSuperName = klass.getName().replace('.', '/');
    this.cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
    cw.visitAsmClassAgent.CLASS_LEVEL,
          ACC_PUBLIC,
          this.myName,
          null,
          enhancedSuperName,
View Full Code Here


    private Class<?> superClass;

    ClassY(Class<?> klass, String myName, Method[] methodArray, Constructor<?>[] constructors) {
        this.myName = myName.replace('.', '/');
        this.enhancedSuperName = klass.getName().replace('.', '/');
        this.cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
        cw.visit(    AsmClassAgent.CLASS_LEVEL,
                    ACC_PUBLIC,
                    this.myName,
                    null,
                    enhancedSuperName,
View Full Code Here

        }
    }

    protected static synchronized Class<?> create(Class<?> classZ) {
        String myName = classZ.getName().replace('.', '/') + FastClass.CLASSNAME + count.getAndIncrement();
        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
        cw.visit(V1_6,
                 ACC_PUBLIC,
                 myName,
                 null,
                 "org/nutz/lang/reflect/AbstractFastClass",
                 null);
        // 添加默认构造方法
        {
            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC,
                                              "<init>",
                                              "()V",
                                              null,
                                              null);
            mv.visitCode();
            mv.visitVarInsn(ALOAD, 0);
            mv.visitMethodInsn(INVOKESPECIAL,
                               "org/nutz/lang/reflect/AbstractFastClass",
                               "<init>",
                               "()V");
            mv.visitInsn(RETURN);
            mv.visitMaxs(1, 1);
            mv.visitEnd();
        }
        // 添加默认字段
        {
            cw.visitField(ACC_PUBLIC + ACC_STATIC,
                          FastClassFactory.MethodArray_FieldName,
                          "[Ljava/lang/reflect/Method;",
                          null,
                          null).visitEnd();
            cw.visitField(ACC_PUBLIC + ACC_STATIC,
                          ConstructorArray_FieldName,
                          "[Ljava/lang/reflect/Constructor;",
                          null,
                          null).visitEnd();
            cw.visitField(ACC_PUBLIC + ACC_STATIC,
                          SrcClass_FieldName,
                          "Ljava/lang/Class;",
                          "Ljava/lang/Class<*>;",
                          null).visitEnd();
        }
        // 实现默认字段的getter
        {
            MethodVisitor mv = cw.visitMethod(ACC_PROTECTED,
                                              "getMethods",
                                              "()[Ljava/lang/reflect/Method;",
                                              null,
                                              null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC,
                              myName,
                              FastClassFactory.MethodArray_FieldName,
                              "[Ljava/lang/reflect/Method;");
            mv.visitInsn(ARETURN);
            mv.visitMaxs(1, 1);
            mv.visitEnd();
            // -----------------------------------------------------------------------------------------------------
            mv = cw.visitMethod(ACC_PROTECTED,
                                "getConstructors",
                                "()[Ljava/lang/reflect/Constructor;",
                                "()[Ljava/lang/reflect/Constructor<*>;",
                                null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC,
                              myName,
                              ConstructorArray_FieldName,
                              "[Ljava/lang/reflect/Constructor;");
            mv.visitInsn(ARETURN);
            mv.visitMaxs(1, 1);
            mv.visitEnd();
            // -----------------------------------------------------------------------------------------------------
            mv = cw.visitMethod(ACC_PROTECTED,
                                "getSrcClass",
                                "()Ljava/lang/Class;",
                                "()Ljava/lang/Class<*>;",
                                null);
            mv.visitCode();
            mv.visitFieldInsn(GETSTATIC,
                              myName,
                              SrcClass_FieldName,
                              "Ljava/lang/Class;");
            mv.visitInsn(ARETURN);
            mv.visitMaxs(1, 1);
            mv.visitEnd();
        }
        Method[] methods = classZ.getMethods();
        Arrays.sort(methods, new MethodComparator());
        // 构建_invoke方法
        {
            String[] methodNames = new String[methods.length];
            String[] descs = new String[methods.length];
            int[] modifies = new int[methods.length];
            int[] invokeOps = new int[methods.length];
            for (int i = 0; i < methods.length; i++) {
                methodNames[i] = methods[i].getName();
                descs[i] = Type.getMethodDescriptor(methods[i]);
                modifies[i] = methods[i].getModifiers();
                if (classZ.isInterface())
                    invokeOps[i] = INVOKEINTERFACE;
                else if (Modifier.isAbstract(methods[i].getModifiers()))
                    invokeOps[i] = INVOKESPECIAL;
                else if (Modifier.isStatic(methods[i].getModifiers()))
                    invokeOps[i] = INVOKESTATIC;
                else
                    invokeOps[i] = INVOKEVIRTUAL;
            }
            FastClassAdpter.createInokeMethod(cw.visitMethod(ACC_PUBLIC
                                                                     + ACC_VARARGS,
                                                             "_invoke",
                                                             "(Ljava/lang/Object;I[Ljava/lang/Object;)Ljava/lang/Object;",
                                                             null,
                                                             null),
                                              methodNames,
                                              descs,
                                              modifies,
                                              invokeOps,
                                              classZ.getName()
                                                    .replace('.', '/'));
        }
        // 添加_born方法
        Constructor<?>[] constructors = classZ.getConstructors();
        Arrays.sort(constructors, new ConstructorComparator());
        if (constructors.length > 0) {
            FastClassAdpter.createInokeConstructor(cw.visitMethod(ACC_PROTECTED
                                                                          + ACC_VARARGS,
                                                                  "_born",
                                                                  "(I[Ljava/lang/Object;)Ljava/lang/Object;",
                                                                  null,
                                                                  null),
                                                   classZ.getName()
                                                         .replace('.', '/'),
                                                   constructors);
        }

        cw.visitEnd();

        Class<?> xClass = DefaultClassDefiner.def(myName.replace('/', '.'),
                                              cw.toByteArray());
        try {
            xClass.getField(SrcClass_FieldName).set(null, classZ);
            xClass.getField(MethodArray_FieldName).set(null, methods);
            xClass.getField(ConstructorArray_FieldName).set(null, constructors);
        }
View Full Code Here

TOP

Related Classes of org.nutz.repo.org.objectweb.asm.ClassWriter

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.