package org.common; import java.io.File; import java.util.Arrays; import java.util.List; import jef.accelerator.asm.AnnotationVisitor; import jef.accelerator.asm.Attribute; import jef.accelerator.asm.ClassReader; import jef.accelerator.asm.ClassVisitor; import jef.accelerator.asm.ClassWriter; import jef.accelerator.asm.FieldVisitor; import jef.accelerator.asm.MethodVisitor; import jef.accelerator.asm.Opcodes; import jef.tools.IOUtils; import org.junit.Test; public class ASMTest extends ClassLoader implements Opcodes { @Test public void createTest() throws Exception { // creates a ClassWriter for the Example public class, // which inherits from Object ClassWriter cw = new ClassWriter(0); cw.visit(V1_5, ACC_PUBLIC, "Example", null, "java/lang/Object", null); MethodVisitor mw = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null); mw.visitVarInsn(ALOAD, 0); mw.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V"); mw.visitInsn(RETURN); mw.visitMaxs(1, 1); mw.visitEnd(); mw = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null); mw.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mw.visitLdcInsn("Hello world!"); mw.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V"); mw.visitInsn(RETURN); mw.visitMaxs(2, 2); mw.visitEnd(); byte[] code = cw.toByteArray(); IOUtils.saveAsFile(new File("c:/temp/ssss1.class"), code); ASMTest loader = new ASMTest(); Class exampleClass = loader.defineClass("Example", code, 0, code.length); exampleClass.getMethods()[0].invoke(null, new Object[] { null }); } @Test public void readClassTest() throws Exception{ ClassReader reader=new ClassReader("org.common.ASMTest"); reader.accept(new ClassVisitor(Opcodes.ASM5){ @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { System.out.println(name); super.visit(version, access, name, signature, superName, interfaces); } @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { // TODO Auto-generated method stub return super.visitAnnotation(desc, visible); } @Override public void visitAttribute(Attribute attr) { // TODO Auto-generated method stub super.visitAttribute(attr); } @Override public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { // TODO Auto-generated method stub return super.visitField(access, name, desc, signature, value); } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { // TODO Auto-generated method stub return super.visitMethod(access, name, desc, signature, exceptions); } @Override public void visitEnd() { // TODO Auto-generated method stub super.visitEnd(); } }, ClassReader.SKIP_DEBUG); } @Test public void test123(){ List<String> args=Arrays.asList("assdasdsa","ss","4"); StringBuffer buf=new StringBuffer(); boolean threeArgs=true; Object pattern = args.get(0); Object string = args.get(1); Object start = threeArgs ? args.get(2) : null; if (threeArgs) buf.append('('); buf.append("position(").append( pattern ).append(" in "); if (threeArgs) buf.append( "substring("); buf.append( string ); if (threeArgs) buf.append( ", " ).append( start ).append(')'); buf.append(')'); if (threeArgs) buf.append('+').append( start ).append("-1)"); System.out.println(buf.toString()); } }