Java asm生成class 计算1

代码片段(1)[全屏查看所有代码]

1.[代码][Java]代码跳至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() {@Overrideprotected 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));}}

,任何的限制,都是从自己的内心开始的。

Java asm生成class 计算1

相关文章:

你感兴趣的文章:

标签云: