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);
}
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();
}
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;
}
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();
}
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 });
}
Aggregations