- package t.z.j;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import org.objectweb.asm.ClassWriter;
- import org.objectweb.asm.Label;
- import org.objectweb.asm.MethodVisitor;
- import org.objectweb.asm.Opcodes;
- public class Testasm {
- public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, FileNotFoundException, IOException {
- ClassWriter classWriter=new ClassWriter(ClassWriter.COMPUTE_MAXS);
- //类开始
- classWriter.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC,
- "Testclass", null, "java/lang/Object", null);
- {
- //构造方法
- MethodVisitor methodVisitor=
- classWriter.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
- methodVisitor.visitCode();
- methodVisitor.visitIntInsn(Opcodes.ALOAD, 0);
- methodVisitor.visitInsn(Opcodes.DUP);
- methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object",
- "<init>", "()V",false);
- methodVisitor.visitInsn(Opcodes.RETURN);
- methodVisitor.visitMaxs(0, 0);
- methodVisitor.visitEnd();
- }
- {
- //计算方法
- MethodVisitor methodVisitor=classWriter.
- visitMethod(Opcodes.ACC_PUBLIC, "calSum","(II)I", null,null);
- methodVisitor.visitCode();
- Label lreturn=new Label(); //方便直接跳到返回的地放
- Label lfor=new Label();//为了循环
- methodVisitor.visitInsn(Opcodes.ICONST_0); //加载0到栈顶
- methodVisitor.visitVarInsn(Opcodes.ISTORE,3); //给第三个赋值为栈顶的值
- methodVisitor.visitLabel(lfor); //ifor标签开始
- methodVisitor.visitIntInsn(Opcodes.ILOAD, 1); //加载第一个变量到栈顶
- methodVisitor.visitIntInsn(Opcodes.ILOAD, 2); //加载第二个变量到栈顶
- //比较栈顶的两个值 如果 第一个比第二个大就退出
- methodVisitor.visitJumpInsn(Opcodes.IF_ICMPGT, lreturn);
- methodVisitor.visitIntInsn(Opcodes.ILOAD, 1); //加载第一个变量到栈顶
- methodVisitor.visitIntInsn(Opcodes.ILOAD, 3);//加载第三个变量到栈顶
- methodVisitor.visitInsn(Opcodes.IADD); //栈顶两个变量的值计算 并压在栈顶
- methodVisitor.visitIntInsn(Opcodes.ISTORE, 3); //把第三个变量赋为栈顶的值
- methodVisitor.visitIincInsn(1, 1); //第一个变量++
- methodVisitor.visitJumpInsn(Opcodes.GOTO, lfor); //跳转到IFOR 重复刚刚的步骤
- methodVisitor.visitLabel(lreturn);
- methodVisitor.visitIntInsn(Opcodes.ILOAD, 3);
- methodVisitor.visitInsn(Opcodes.IRETURN);
- methodVisitor.visitMaxs(3, 3);
- methodVisitor.visitEnd();
- }
- classWriter.visitEnd();//类结束
- final byte[] bs=classWriter.toByteArray();
- ClassLoader classLoader=new ClassLoader() {
- @Override
- protected Class<?> findClass(String name)
- throws ClassNotFoundException {
- return defineClass(name, bs, 0, bs.length);
- }
- };
- Class class1=classLoader.loadClass("Testclass");
- Object testclass=class1.newInstance();
- Method method=class1.getDeclaredMethod("calSum", int.class,int.class);
- System.out.println( method.invoke(testclass, 1,100));
- }
- }
- //该片段来自于http://www.codesnippet.cn/detail/2405201614684.html
来源: http://www.codesnippet.cn/detail/2405201614684.html