Search in sources :

Example 1 with MethodVisitor

use of act.asm.MethodVisitor in project actframework by actframework.

the class ControllerEnhancer method visitMethod.

@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
    MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
    HandlerMethodMetaInfo info = methodInfo(name);
    if (null == info) {
        return mv;
    }
    logger.debug(">>>About to enhance handler: %s", name);
    return new HandlerEnhancer(mv, info, access, name, desc, signature, exceptions);
}
Also used : HandlerMethodMetaInfo(act.controller.meta.HandlerMethodMetaInfo) MethodVisitor(act.asm.MethodVisitor)

Example 2 with MethodVisitor

use of act.asm.MethodVisitor in project actframework by actframework.

the class EntityClassEnhancer method visitEnd.

@Override
public void visitEnd() {
    if (isEntityClass) {
        if (!daoMethodFound) {
            // add Model.dao() method
            MethodVisitor mv = super.visitMethod(ACC_PUBLIC + ACC_STATIC, "dao", "()Lact/db/Dao;", "<ID_TYPE:Ljava/lang/Object;MODEL_TYPE:Lact/db/ModelBase<TID_TYPE;TMODEL_TYPE;>;QUERY_TYPE::Lact/db/Dao$Query<TMODEL_TYPE;TQUERY_TYPE;>;DAO_TYPE::Lact/db/Dao<TID_TYPE;TMODEL_TYPE;TQUERY_TYPE;TDAO_TYPE;>;>()TDAO_TYPE;", null);
            mv.visitCode();
            mv.visitMethodInsn(INVOKESTATIC, "act/app/App", "instance", "()Lact/app/App;", false);
            mv.visitMethodInsn(INVOKEVIRTUAL, "act/app/App", "dbServiceManager", "()Lact/app/DbServiceManager;", false);
            mv.visitLdcInsn(Type.getType(classDesc));
            mv.visitMethodInsn(INVOKEVIRTUAL, "act/app/DbServiceManager", "dao", "(Ljava/lang/Class;)Lact/db/Dao;", false);
            mv.visitInsn(ARETURN);
            mv.visitMaxs(2, 0);
            mv.visitEnd();
        }
        if (!daoClsMethodFound) {
            // add Model.dao(Class c) method
            MethodVisitor mv = super.visitMethod(ACC_PUBLIC + ACC_STATIC, "dao", "(Ljava/lang/Class;)Lact/db/Dao;", "<T::Lact/db/Dao;>(Ljava/lang/Class<TT;>;)TT;", null);
            mv.visitCode();
            mv.visitMethodInsn(INVOKESTATIC, "act/app/App", "instance", "()Lact/app/App;", false);
            mv.visitMethodInsn(INVOKEVIRTUAL, "act/app/App", "dbServiceManager", "()Lact/app/DbServiceManager;", false);
            mv.visitLdcInsn(Type.getType(classDesc));
            mv.visitMethodInsn(INVOKEVIRTUAL, "act/app/DbServiceManager", "dao", "(Ljava/lang/Class;)Lact/db/Dao;", false);
            mv.visitInsn(ARETURN);
            mv.visitMaxs(1, 1);
            mv.visitEnd();
        }
    }
    super.visitEnd();
}
Also used : MethodVisitor(act.asm.MethodVisitor)

Example 3 with MethodVisitor

use of act.asm.MethodVisitor in project actframework by actframework.

the class CommanderEnhancer method visitMethod.

@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
    MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
    if (null == metaInfo || isConstructor(name)) {
        return mv;
    }
    final CommandMethodMetaInfo methodInfo = metaInfo.command(name);
    if (null == methodInfo) {
        return mv;
    }
    if (isPublic(access) && !isConstructor(name)) {
        return new MethodVisitor(ASM5, mv) {

            private Set<Integer> skipNaming = new HashSet<Integer>();

            @Override
            public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) {
                if ("Ljavax/inject/Named;".equals(desc)) {
                    skipNaming.add(parameter);
                }
                return super.visitParameterAnnotation(parameter, desc, visible);
            }

            @Override
            public void visitEnd() {
                int sz = methodInfo.paramCount();
                for (int i = 0; i < sz; ++i) {
                    if (!skipNaming.contains(i)) {
                        String name = methodInfo.param(i).name();
                        AnnotationVisitor av = mv.visitParameterAnnotation(i, "Ljavax/inject/Named;", true);
                        av.visit("value", name);
                    }
                }
                super.visitEnd();
            }
        };
    }
    return mv;
}
Also used : HashSet(java.util.HashSet) Set(java.util.Set) CommandMethodMetaInfo(act.cli.meta.CommandMethodMetaInfo) AnnotationVisitor(act.asm.AnnotationVisitor) MethodVisitor(act.asm.MethodVisitor)

Example 4 with MethodVisitor

use of act.asm.MethodVisitor in project actframework by actframework.

the class SingletonEnhancer method addInstanceMethod.

private void addInstanceMethod() {
    MethodVisitor mv = super.visitMethod(ACC_PUBLIC + ACC_STATIC, "instance", "()Ljava/lang/Object;", "<T:Ljava/lang/Object;>()TT;", null);
    mv.visitCode();
    mv.visitMethodInsn(INVOKESTATIC, "act/app/App", "instance", "()Lact/app/App;", false);
    mv.visitLdcInsn(Type.getType(instanceTypeDesc()));
    mv.visitMethodInsn(INVOKEVIRTUAL, "act/app/App", "singleton", "(Ljava/lang/Class;)Ljava/lang/Object;", false);
    mv.visitInsn(ARETURN);
    mv.visitMaxs(2, 0);
    mv.visitEnd();
}
Also used : MethodVisitor(act.asm.MethodVisitor)

Example 5 with MethodVisitor

use of act.asm.MethodVisitor in project actframework by actframework.

the class HelloWorld method main.

public static void main(final String[] args) throws Exception {
    // Generates the bytecode corresponding to the following Java class:
    // 
    // public class Example {
    // public static void main (String[] args) {
    // System.out.println("Hello world!");
    // }
    // }
    // creates a ClassWriter for the Example public class,
    // which inherits from Object
    ClassWriter cw = new ClassWriter(0);
    cw.visit(V1_1, ACC_PUBLIC, "Example", null, "java/lang/Object", null);
    // creates a MethodWriter for the (implicit) constructor
    MethodVisitor mw = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
    // pushes the 'this' variable
    mw.visitVarInsn(ALOAD, 0);
    // invokes the super class constructor
    mw.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
    mw.visitInsn(RETURN);
    // this code uses a maximum of one stack element and one local variable
    mw.visitMaxs(1, 1);
    mw.visitEnd();
    // creates a MethodWriter for the 'main' method
    mw = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
    // pushes the 'out' field (of type PrintStream) of the System class
    mw.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
    // pushes the "Hello World!" String constant
    mw.visitLdcInsn("Hello world!");
    // invokes the 'println' method (defined in the PrintStream class)
    mw.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
    mw.visitInsn(RETURN);
    // this code uses a maximum of two stack elements and two local
    // variables
    mw.visitMaxs(2, 2);
    mw.visitEnd();
    // gets the bytecode of the Example class, and loads it dynamically
    byte[] code = cw.toByteArray();
    FileOutputStream fos = new FileOutputStream("Example.class");
    fos.write(code);
    fos.close();
    HelloWorld loader = new HelloWorld();
    Class<?> exampleClass = loader.defineClass("Example", code, 0, code.length);
    // uses the dynamically generated class to print 'HelloWorld'
    exampleClass.getMethods()[0].invoke(null, new Object[] { null });
    // ------------------------------------------------------------------------
    // Same example with a GeneratorAdapter (more convenient but slower)
    // ------------------------------------------------------------------------
    cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    cw.visit(V1_1, ACC_PUBLIC, "Example", null, "java/lang/Object", null);
    // creates a GeneratorAdapter for the (implicit) constructor
    Method m = Method.getMethod("void <init> ()");
    GeneratorAdapter mg = new GeneratorAdapter(ACC_PUBLIC, m, null, null, cw);
    mg.loadThis();
    mg.invokeConstructor(Type.getType(Object.class), m);
    mg.returnValue();
    mg.endMethod();
    // creates a GeneratorAdapter for the 'main' method
    m = Method.getMethod("void main (String[])");
    mg = new GeneratorAdapter(ACC_PUBLIC + ACC_STATIC, m, null, null, cw);
    mg.getStatic(Type.getType(System.class), "out", Type.getType(PrintStream.class));
    mg.push("Hello world!");
    mg.invokeVirtual(Type.getType(PrintStream.class), Method.getMethod("void println (String)"));
    mg.returnValue();
    mg.endMethod();
    cw.visitEnd();
    code = cw.toByteArray();
    loader = new HelloWorld();
    exampleClass = loader.defineClass("Example", code, 0, code.length);
    // uses the dynamically generated class to print 'HelloWorld'
    exampleClass.getMethods()[0].invoke(null, new Object[] { null });
}
Also used : PrintStream(java.io.PrintStream) FileOutputStream(java.io.FileOutputStream) GeneratorAdapter(act.asm.commons.GeneratorAdapter) Method(act.asm.commons.Method) ClassWriter(act.asm.ClassWriter) MethodVisitor(act.asm.MethodVisitor)

Aggregations

MethodVisitor (act.asm.MethodVisitor)7 AnnotationVisitor (act.asm.AnnotationVisitor)2 ClassWriter (act.asm.ClassWriter)1 Type (act.asm.Type)1 GeneratorAdapter (act.asm.commons.GeneratorAdapter)1 Method (act.asm.commons.Method)1 CommandMethodMetaInfo (act.cli.meta.CommandMethodMetaInfo)1 HandlerMethodMetaInfo (act.controller.meta.HandlerMethodMetaInfo)1 SenderMethodMetaInfo (act.mail.meta.SenderMethodMetaInfo)1 ByteCodeVisitor (act.util.ByteCodeVisitor)1 FileOutputStream (java.io.FileOutputStream)1 PrintStream (java.io.PrintStream)1 HashSet (java.util.HashSet)1 Set (java.util.Set)1