- 浏览: 862719 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (509)
- android (55)
- CSS (23)
- eclipse (25)
- Data Structes and Algorithms (53)
- J2SE (87)
- Java_面试学习_j2se (26)
- java_面试学习_非技术 (13)
- java_gui (2)
- java_设计模式 (27)
- JDBC (10)
- java_web (15)
- hibernate (5)
- Oracle (37)
- Struts2 (7)
- Word-----dos (24)
- Jbpm (3)
- java小技巧 (8)
- math (1)
- flex (12)
- WebService (4)
- 生活 (9)
- 小框架或小语言 (27)
- spring (1)
- 面试~~~软实力 (7)
- jstat的用法 (1)
- jmap (1)
- 数据链路层和传输层的流量控制区别 (1)
- shell (0)
- 财商 (1)
- javascript (0)
- js研究 (1)
- 代码收集 (0)
最新评论
-
海尔群:
http://jingyan.baidu.com/articl ...
android加密 -
完美天龙:
------------------------- ...
asm----字节码操纵 -
houniao1990:
大神,请问 string 类型 定义为 oracle的 cha ...
hibernate注解 -
JamesQian:
Line:103
f.doFilter(msg);
是否需 ...
责任链模式_过滤器模式 -
sacoole:
好评
interview--- 如何从N个数中选出最大(小)的n个数?
想通过asm的代码生成来写.class文件至少得了解下面的东西。 1.ICONST_x相当于常量,前面的I是指int型,还有其它型的CONST,这个量为比如ICONST_1就是1,对于后面不同的操作,它会再指定实际的类型。使用visitInsn(ICONST_1)就是说定义了一个为1的临时量压到栈里面,但不会定义一个变量。-1<=ICONST<=5;如果要定义大点的数就使用visitVarInsn(BIPUSH, 10) 2.ISTORE是把栈顶的临时量保存成变量如visitVarInsn(ISTORE, 1)保存在位置1,如果想把变量值拿出来用如下进行,把位置1的值拿出来放到栈顶visitVarInsn(ILOAD, 1); 3.visitIincInsn(1, 1);对位置是1的变量进行自增,自增幅度为后面参数所定义的1。 4.对于栈的操作还有DUP,POP,SWAP等命令。需要理解栈的存取。 5.for循环例子代码,使用了两个label来完成,开始初学对字节码不明白,所以先从.class文件反译成字节码来进行。相当于实现: ----------------------------- for(int i = 1; i >= 10;) { i++; byte byte0 = 2; } ----------------------------- Label forLabel = new Label(); Label endLabel = new Label(); mw.visitInsn(ICONST_1); mw.visitVarInsn(ISTORE, 1); mw.visitLabel(forLabel); mw.visitVarInsn(ILOAD, 1); mw.visitVarInsn(BIPUSH, 10); mw.visitJumpInsn(IF_ICMPLT, endLabel); mw.visitIincInsn(1, 1);// ++操作 mw.visitInsn(ICONST_2); mw.visitVarInsn(ISTORE, 2); //这循环体内进做了 int c = 2的操作 mw.visitJumpInsn(GOTO, forLabel); mw.visitLabel(endLabel); 5.条件语句例子:没用使用GOTO,相当于实现 ------------------------- int i = 3; if(i >= 0) i = 1 + i; -------------------------- Label label = new Label(); mw.visitInsn(ICONST_3); mw.visitVarInsn(ISTORE, 1); mw.visitVarInsn(ILOAD, 1); mw.visitJumpInsn(IFLT, label); mw.visitInsn(ICONST_1); mw.visitIntInsn(ILOAD, 1); mw.visitInsn(IADD); mw.visitVarInsn(ISTORE, 1); mw.visitLabel(label); -------------------------------------------------- Visitor访问者模式作用于某个对象的操作,它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作。 在asm中,ClassReader对象可以接受一个实现ClassVisitor接口的对象来进行对读入的Class的访问与控制。 其中,如asm文档展示了一个很简单的ClassPrinter类,用来打印类相关信息。 ClassPrinter cp = new ClassPrinter(); ClassReader cr = new ClassReader("java.lang.Runnable"); cr.accept(cp, 0); ClassPrinter实现了ClassVisitor接口 public class ClassPrinter implements ClassVisitor { public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { System.out.println(name + " extends " + superName + " {"); } public void visitSource(String source, String debug) { System.out.println("[" + source + "]"); } public void visitOuterClass(String owner, String name, String desc) { System.out.println("[outerClass]" + owner + " " + name + " " + desc); } public AnnotationVisitor visitAnnotation(String desc, boolean visible) { return null; } public void visitAttribute(Attribute attr) { System.out.println("[Attribute]" + attr); } public void visitInnerClass(String name, String outerName, String innerName, int access) { } public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { System.out.println(" " + desc + " " + name); return null; } public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { System.out.println(" " + name + desc); return null; } public void visitEnd() { System.out.println("}"); } } 对于ClassVisitor接口,asm在其之上提供了一个适配器的功能。ClassAdapter用来对ClassReader和ClassWriter中间的适配工作。ClassAdapter实现了ClassVisitor接口,是一个具体类。我们可以继承于ClassAdapter类来实现我们的逻辑。 ClassAdatper作为具体类的好处是我们只需要重写我们关心的东西。使用ClassAdapter我们可以在字节码级别更改我们的类,一个应用就是实现我们的AOP。 这是我们的目标类 package com.c2.asm; public class B { public int number = 20; public int getNumber() { System.out.println("class B logic"); return number; } public static void main(String[] args) { B b = new B(); System.out.println(b.getNumber()); } } 我们的任务是对getNumber()方法的更改,在打印"class B logic"之前实现使number的值由原来的20增加到23,在打印"class B logic"之后实现打印"after"语句。 设计类AopExampleAdapter,当中使用到了AopMethodAdapter来实施主要改写逻辑。 class AopMethodAdapter extends MethodAdapter implements Opcodes { public AopMethodAdapter(MethodVisitor mv) { super(mv); } // 执行方法之前 @Override public void visitCode() { mv.visitVarInsn(ALOAD, 0); //将第一个参数带入方法,并将其推送至执行堆栈 mv.visitInsn(DUP); mv.visitFieldInsn(GETFIELD, "com/c2/asm/B", "number", "I"); mv.visitInsn(ICONST_3); mv.visitInsn(IADD); mv.visitFieldInsn(PUTFIELD, "com/c2/asm/B", "number", "I"); } //执行方法之后 @Override public void visitInsn(int opcode) { if ((opcode >= IRETURN && opcode <= RETURN) || opcode == ATHROW) { mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitLdcInsn("after"); // invokes the 'println' method (defined in the PrintStream class) mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V"); } mv.visitInsn(opcode); } //修改类中使用到的stack和locals大小,我没仔细算过 +2,+3都瞎写的 @Override public void visitMaxs(int maxStack, int maxLocals) { mv.visitMaxs(maxStack + 2, maxLocals + 3); } } public class AopExampleAdapter extends ClassAdapter implements Opcodes { public AopExampleAdapter(ClassVisitor cv) { super(cv); } public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv; mv = cv.visitMethod(access, name, desc, signature, exceptions); // 当匹配到getNumber方法后进行对方法修改 if (mv != null && name.equals("getNumber")) { mv = new AopMethodAdapter(mv); } return mv; } } 使用AopMethodAdapter如ClassVisitor方法一样,因为AopMethodAdapter是基于ClassVisitor来实现的。 “aload_0”指示符将第一个参数带入方法,并将其推送至执行堆栈。“invokespecial”指示符,不言而喻,它将调用实例的方法,但是忽略传统的动态绑定
评论
1 楼
完美天龙
2014-12-08
-------------------------
int i = 3;
if(i >= 0)
i = 1 + i;
--------------------------
Label label = new Label();
mw.visitInsn(ICONST_3);
mw.visitVarInsn(ISTORE, 1);
mw.visitVarInsn(ILOAD, 1);
mw.visitJumpInsn(IFLT, label);
mw.visitInsn(ICONST_1);
mw.visitIntInsn(ILOAD, 1);
mw.visitInsn(IADD);
mw.visitVarInsn(ISTORE, 1);
mw.visitLabel(label);
--------------------------
请教下、这里如果要把i的最终值输出,语法要怎么写?
int i = 3;
if(i >= 0)
i = 1 + i;
--------------------------
Label label = new Label();
mw.visitInsn(ICONST_3);
mw.visitVarInsn(ISTORE, 1);
mw.visitVarInsn(ILOAD, 1);
mw.visitJumpInsn(IFLT, label);
mw.visitInsn(ICONST_1);
mw.visitIntInsn(ILOAD, 1);
mw.visitInsn(IADD);
mw.visitVarInsn(ISTORE, 1);
mw.visitLabel(label);
--------------------------
请教下、这里如果要把i的最终值输出,语法要怎么写?
发表评论
-
jdbc--批处理
2012-06-08 18:15 1076http://jdgnewtouch.iteye.com/bl ... -
jdbc
2012-06-07 20:51 856http://www.iteye.com/topic/6466 ... -
j2se----jdk6---httpServer
2012-06-05 20:42 1347package com.tdt.server.httpse ... -
j2se基础---ThreadLocal
2012-06-02 20:47 1018package cn.itcast.heima2; ... -
获取运行时的堆栈信息
2011-12-11 11:00 2131public class Hi { public st ... -
简说XML的解析方式(DOM,SAX,StAX)
2011-09-30 08:44 873一般来说,解析XML文件存在着两种方式,一种是event-ba ... -
j2se----Java异步socket
2011-07-11 17:10 1404用异步输入输出流编写Socket进程通信程序 在Merlin ... -
j2se----socket的缓冲区讨论
2011-07-08 19:52 1728关于socket的发送缓冲区 ... -
Tomcat的Socket实现:org.apache.tomcat.util.net(一)
2011-07-08 19:12 1649org.apache.tomcat.util.net包的内容都 ... -
翻转句子中单词的顺序
2011-07-07 22:42 1703题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺 ... -
j2se---同步的Map
2011-07-07 20:50 976顾名思义LinkedHashMap是比HashMap多了一个链 ... -
j2se---同步的Map
2011-07-07 20:48 10Map<String String> map = ... -
j2se----java中,如何获得用户当前的工作目录
2011-05-11 09:44 1816获得当前路径, get java current dire ... -
j2se-----zip
2011-05-10 09:05 1021private InitData getInitFile( ... -
j2se-----可变参数列表
2011-04-01 10:53 839public static void main(Strin ... -
UML
2010-12-31 09:42 866组合: 一种强聚合 class Bird{ ... -
j2se-----metadata
2010-12-19 17:14 985DatabaseMetaData的用法 ... -
python------一小时学会
2010-12-08 16:28 1871先上java与python的相互调用 如何在Java中调用Jy ... -
j2ee------download.jsp
2010-12-08 13:39 1093Logger logger = C ... -
effective------equals , hashCode
2010-11-22 12:04 1019覆盖equals时总是覆盖hashCode :你都认为他 ...
相关推荐
asm-util-1.3.4.jar, asm-util-1.3.5.jar, asm-util-1.4.1.jar, asm-util-1.4.3.jar, asm-util-1.5.1.jar, asm-util-1.5.2.jar, asm-util-1.5.3.jar, asm-util-2.0.jar, asm-util-2.1.jar, asm-util-2.2.1-sources....
asm-2.2.3.jar,asm-commons-2.2.3.jar,asm-util-2.2.3.jar,cglib-nodep-2.1_3.jar
资源包含asm-all-3.0.jar等jar包,可以解决程序中因asm版本引起的兼容性错误。其他相关的jar如下: asm-all-3.0.jar asm-2.2.3.jar asm.jar asm-attrs.jar asm-commons-2.2.3.jar asm-util-2.2.3.jar
赠送jar包:asm-9.1.jar; 赠送原API文档:asm-9.1-javadoc.jar; 赠送源代码:asm-9.1-sources.jar; 赠送Maven依赖信息文件:asm-9.1.pom; 包含翻译后的API文档:asm-9.1-javadoc-API文档-中文(简体)版.zip; ...
asm-util-6.0.jar 编写工具测试类中用到,配合asm-6.0.jar使用
赠送jar包:asm-4.2.jar; 赠送原API文档:asm-4.2-javadoc.jar; 赠送源代码:asm-4.2-sources.jar; 赠送Maven依赖信息文件:asm-4.2.pom; 包含翻译后的API文档:asm-4.2-javadoc-API文档-中文(简体)版.zip; ...
asm-commons-3.3.1.jar
asm-commons-2.0.jar, asm-commons-2.1.jar, asm-commons-2.2.1-sources.jar, asm-commons-2.2.1.jar, asm-commons-2.2.2-sources.jar, asm-commons-2.2.2.jar, asm-commons-2.2.3.jar, asm-commons-2.2.jar, asm-...
asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-...
kmod-oracleasm-2.0.6.rh1-3.el6.x86_64.rpm和Oracleasmlib、Oracleasm-support,
kmod-oracleasm-2.0.8-15.el6_9.x86_64 oracleasm-support-2.1.8-1.el6.x86_64 oracleasmlib-2.0.4-1.el6.x86_64 安装顺序: rpm -ivh kmod-oracleasm-2.0.8-15.el6_9.x86_64.rpm rpm -ivh oracleasm-support-2.1.8...
asm-1.3.3.jar, asm-1.3.4.jar, asm-1.3.5.jar, asm-1.4.1.jar, asm-1.4.2.jar, asm-1.4.3.jar, asm-1.4.jar, asm-1.5.1.jar, asm-1.5.2.jar, asm-1.5.3.jar, asm-2.0.jar, asm-2.1.jar, asm-2.2.1-sources.jar, asm...
还在为找不到jar文件烦心吗,不用了到我空间来有你想要的,持续更新。。。 asm-2.2.3.jar,asm-commons-2.2.3.jar,asm-util-2.2.3.jar
动态代理包含asm-commons-3.2、asm-3.2.jar、免费下载使用 动态代理包含asm-commons-3.2、asm-3.2.jar、免费下载使用 动态代理包含asm-commons-3.2、asm-3.2.jar、免费下载使用
cglib动态代理模式jar包 cglib-2.2.jar asm-tree.jar asm-commons.jar asm.jar
asm-all-3.2.jar 全集满足spring aop 开发过程中遇到的问题
不然有以下报错java.lang.NoClassDefFoundError: com/opensymphony/xwork2/util/finder/ClassFinder$InfoBuildingVisitor,导入asm-3.3.jar,asm-commons-3.3,asm-tree-3.3.jar即可,压缩包里面有
开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具 asm-5.1开发工具...
想说找你不容易,asm-all-5.0.jar
struts2.3开发依赖的asm包.不然有以下报错java.lang.NoClassDefFoundError: com/opensymphony/xwork2/util/finder/ClassFinder$InfoBuildingVisitor,导入asm-3.3.jar,asm-commons-3.3,asm-tree-3.3.jar即可