- 浏览: 582228 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (174)
- JBPM (3)
- WWF (0)
- JavaScript (11)
- J2EE (40)
- OperationSystem (11)
- 数据库 (12)
- CSS (1)
- Ajax (2)
- J2SE (30)
- Tools (10)
- 服务器中间件 (3)
- 异常 (0)
- Flex (5)
- jQuery (11)
- html (9)
- Ejb (1)
- HTML5 Shiv–让该死的IE系列支持HTML5吧 (1)
- Spring (9)
- Quartz (3)
- log4j (1)
- maven (1)
- cpdetector (1)
- JSON (1)
- log4jdbc (1)
- asm (8)
- FusionCharts (1)
- jqplot (1)
- highcharts (1)
- excanvas (1)
- html5 (1)
- jpcap介绍 (1)
- weblogic (3)
- URLURLClassLoader (0)
- URLClassLoader (1)
- ant (2)
- ivy (2)
- nexus (1)
- IT (0)
- LoadRunner (1)
- SCSS (1)
- ruby (1)
- webstorm (1)
- typescript (1)
- Jboss7 (1)
- wildfly (1)
- oracle (5)
- esb (0)
- dubbo (2)
- zookeeper (3)
- eclipse (1)
- Android (2)
- Studio (1)
- Google (1)
- 微信 (1)
- 企业号 (1)
- Linux (13)
- Oracle12c (1)
- Hadoop (1)
- InletexEMC (1)
- Windows (1)
- Netty (3)
- Marshalling (2)
- Protobuf (1)
- gcc (1)
- Git (1)
- GitLab (1)
- shell (2)
- java (3)
- Spring4 (1)
- hibernate4 (1)
- postgresql (1)
- ApacheServer (2)
- Tomcat (2)
- ApacheHttpServer (2)
- realvnc (1)
- redhat (7)
- vncviewer (1)
- LVS (4)
- LVS-DR (1)
- RedHat6.5 (5)
- LVS-NAT (1)
- LVS-IPTUNNEL (2)
- LVS-TUN (1)
- keepalived (2)
- yum (1)
- iso (1)
- VMware (1)
- redhat5 (1)
- ha (1)
- nginx (2)
- proguard (1)
- Mat (1)
- DTFJ (1)
- axis2 (1)
- web service (1)
- centos (1)
- random (1)
- urandom (1)
- apache (1)
- IBM (1)
- cve (1)
- 漏洞 (1)
- JDBC (1)
- DataSource (1)
- jdk (1)
- tuxedo (2)
- wtc (1)
最新评论
-
skying007:
好资料,谢谢分享给啊
FusionCharts在服务器端导出图片(J2EE版) -
cgnnzg:
大神好 可以发一份源码给我学习么 多谢了 978241085 ...
springmvc+dubbo+zookeeper -
jifengjianhao:
求源码:854606899@qq.com
springmvc+dubbo+zookeeper -
wdloyeu:
shihuan8@163.com邮箱网盘在哪,没找到。能给份源 ...
Java Socket长连接示例代码 -
huangshangyuanji:
求代码:45613032@qq.com
springmvc+dubbo+zookeeper
以下代码需要asm-5.0.2.jar和asm-commons-5.0.2.jar两个包。
【注】:本例中涉及到org.objectweb.asm.Label类和visitTypeInsn、visitInsn、visitVarInsn、visitLocalVariable等函数的参数意义问题,如果有想深入学习Asm5.0.2的朋友,请联系笔者,笔者学习Asm5.0.2的Java代码在shihuan83019@163.com的网盘的原创作品里。
----------------------------------------------------------------------------------
下面是笔者改Oracle的代码例子:
package com.shihuan.field; public class AccountField { String sql = "select * from tables"; public void operation() { System.out.println("shihuan operation..."); } int executeInternal() { System.out.println("shihuan executeInternal..."); return 1; } }
package com.shihuan.field; public class TestAccountField { public static void main(String[] args) { AccountField t = new AccountField(); t.operation(); t.executeInternal(); } }
package com.shihuan.field; public class SecurityCheckerField { public static void checkCode(AccountField afObj, java.util.Date startdate) { System.out.println("shihuan starttime --->> " + startdate); long endtime = System.currentTimeMillis(); java.util.Date enddate = new java.util.Date(endtime); System.out.println("shihuan endtime --->> " + enddate); System.out.println(afObj.sql); } }
package com.shihuan.field; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; public class GeneratorAsmField { public static void main(String[] args) throws IOException { ClassReader cr = new ClassReader("com.shihuan.field.AccountField"); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS); ClassVisitor cv = new ClassVisitor(Opcodes.ASM5, cw) { public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); // 先得到原始的方法 MethodVisitor newMethod = mv; if (mv != null) { if ("executeInternal".equals(name)) { // 此处的executeInternal即为需要修改的方法,修改方法內容 // 访问需要修改的方法 newMethod = new MethodVisitor(Opcodes.ASM5, mv) { public void visitCode() { Label startlabel = new Label(); visitLabel(startlabel); visitLineNumber(13, startlabel); visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "currentTimeMillis", "()J", false); visitVarInsn(Opcodes.LSTORE, 2); Label ctmlabel = new Label(); visitLabel(ctmlabel); visitLineNumber(14, ctmlabel); visitTypeInsn(Opcodes.NEW, "java/util/Date"); visitInsn(Opcodes.DUP); visitVarInsn(Opcodes.LLOAD, 2); visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/Date", "<init>", "(J)V", false); visitVarInsn(Opcodes.ASTORE, 4); Label sdlabel = new Label(); visitLabel(sdlabel); visitLineNumber(16, sdlabel); Label endlabel = new Label(); visitLabel(endlabel); visitLocalVariable("this", "Lcom/shihuan/field/AccountField;", null, startlabel, endlabel, 0); visitLocalVariable("starttime", "J", null, ctmlabel, endlabel, 2); visitLocalVariable("startdate", "Ljava/util/Date;", null, sdlabel, endlabel, 4); super.visitCode(); } public void visitInsn(int opcode) { if ((opcode >= Opcodes.IRETURN && opcode <= Opcodes.RETURN) || opcode == Opcodes.ATHROW) { visitVarInsn(Opcodes.ALOAD, 0); visitVarInsn(Opcodes.ALOAD, 4); visitMethodInsn( Opcodes.INVOKESTATIC, "com/shihuan/field/SecurityCheckerField", "checkCode", "(Lcom/shihuan/field/AccountField;Ljava/util/Date;)V", false); } super.visitInsn(opcode); } }; } } return newMethod; } }; cr.accept(cv, ClassReader.SKIP_DEBUG); byte[] code = cw.toByteArray(); OutputStream fos = new FileOutputStream("D:/myworkspace/JavaAsm/bin/com/shihuan/field/AccountField.class"); fos.write(code); fos.close(); } }
【注】:本例中涉及到org.objectweb.asm.Label类和visitTypeInsn、visitInsn、visitVarInsn、visitLocalVariable等函数的参数意义问题,如果有想深入学习Asm5.0.2的朋友,请联系笔者,笔者学习Asm5.0.2的Java代码在shihuan83019@163.com的网盘的原创作品里。
----------------------------------------------------------------------------------
下面是笔者改Oracle的代码例子:
package oracle.jdbc.driver; public class OracleMyEnd { public static void getMySqlInfo(OraclePreparedStatement opsObj, java.util.Date startdate){ System.out.println(startdate); System.out.println("ShiHuan Is Inner --->> " + opsObj.sqlObject.originalSql); } }
package oracle.jdbc.driver; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; public class OracleGeneratorAsm { public static void main(String[] args) throws IOException { ClassReader cr = new ClassReader("oracle.jdbc.driver.OraclePreparedStatement"); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS); ClassVisitor cv = new ClassVisitor(Opcodes.ASM5, cw) { public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); // 先得到原始的方法 MethodVisitor newMethod = mv; if (mv != null) { if ("executeInternal".equals(name)) { // 此处的executeInternal即为需要修改的方法,修改方法內容 // 访问需要修改的方法 newMethod = new MethodVisitor(Opcodes.ASM5, mv) { public void visitCode() { Label startlabel = new Label(); visitLabel(startlabel); visitLineNumber(3362, startlabel); visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "currentTimeMillis", "()J", false); visitVarInsn(Opcodes.LSTORE, 5); Label ctmlabel = new Label(); visitLabel(ctmlabel); visitLineNumber(3363, ctmlabel); visitTypeInsn(Opcodes.NEW, "java/util/Date"); visitInsn(Opcodes.DUP); visitVarInsn(Opcodes.LLOAD, 5); visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/Date", "<init>", "(J)V", false); visitVarInsn(Opcodes.ASTORE, 7); Label sdlabel = new Label(); visitLabel(sdlabel); visitLineNumber(3364, sdlabel); Label endlabel = new Label(); visitLabel(endlabel); visitLocalVariable("this", "Loracle/jdbc/driver/OraclePreparedStatement;", null, startlabel, endlabel, 0); visitLocalVariable("starttime", "J", null, ctmlabel, endlabel, 5); visitLocalVariable("startdate", "Ljava/util/Date;", null, sdlabel, endlabel, 7); super.visitCode(); } public void visitInsn(int opcode) { if ((opcode >= Opcodes.IRETURN && opcode <= Opcodes.RETURN) || opcode == Opcodes.ATHROW) { visitVarInsn(Opcodes.ALOAD, 0); visitVarInsn(Opcodes.ALOAD, 7); visitMethodInsn( Opcodes.INVOKESTATIC, "oracle/jdbc/driver/OracleMyEnd", "getMySqlInfo", "(Loracle/jdbc/driver/OraclePreparedStatement;Ljava/util/Date;)V", false); } super.visitInsn(opcode); } }; } } return newMethod; } }; cr.accept(cv, ClassReader.SKIP_DEBUG); byte[] code = cw.toByteArray(); OutputStream fos = new FileOutputStream("D:/ojdbc6_b/oracle/jdbc/driver/OraclePreparedStatement.class"); fos.write(code); fos.close(); } }
发表评论
-
Asm更改类名
2014-06-11 13:58 1139http://www.oschina.net/code/sni ... -
Java字节码删除或者添加一个类方法
2014-05-30 15:52 4510以下代码需要asm-5.0.2.jar和asm-commons ... -
Java字节码删除或者添加一个类成员
2014-05-30 13:29 1496以下代码需要asm-5.0.2.jar和asm-commons ... -
JAVA字节码对照表
2014-05-30 11:05 2668http://www.ibm.com/developerwor ... -
Java字节码实现Aop(续一)
2014-05-29 10:43 1428以下代码需要asm-5.0.2.jar和asm-commons ... -
Java字节码实现Aop
2014-05-25 12:00 1288以下代码需要asm-5.0.2.jar和asm-commons ... -
Java字节码
2014-05-18 15:33 960http://asm.ow2.org/index.html ...
相关推荐
Java字节码实现AOP(面向切面编程)是一种在程序运行时动态插入代码的技术,它使得我们可以在不修改原有代码的情况下,增加新的功能或监控已有功能。在Java中,AOP通常通过代理模式和字节码操作来实现,如Spring AOP...
ASM是一个底层的Java字节码操控和分析框架,可以用来动态生成类或者增强已有类的功能。 **CGLIB的使用步骤**: 1. 引入依赖:在项目中引入CGLIB的依赖库,通常通过Maven或Gradle等构建工具添加。 2. 创建Enhancer...
Java字节码编辑器是一种工具,它允许开发者直接编辑Java程序编译后的`.class`文件,而不是反编译后再重新编译。这种编辑器对于理解、调试和优化Java代码非常有用,尤其是对于那些无法访问源代码或者需要进行底层操作...
1. **字节码**:Java字节码是Java虚拟机(JVM)运行的二进制代码,它由javac编译器将源代码编译成。每个类都有一个`.class`文件,其中包含了该类的字节码。 2. **API组件**:BCEL包含一系列接口和类,如`ClassGen`,...
**CGlib:高级Java字节码生成库** CGlib(Code Generation Library)是一个强大的高性能的代码生成库,它主要用于在运行期扩展Java类与实现Java接口。这个库最初由Evan Schooler创建,后来成为Apache软件基金会的一...
通过深入了解这些结构,开发者可以更好地理解Java字节码的工作原理,从而优化代码执行效率,调试程序,甚至实现字节码级别的动态修改和插桩技术。这对于性能调优、AOP(面向切面编程)以及理解JVM的工作方式至关重要...
6. **字节码操纵**:Java字节码操纵库,如ASM、BCEL、CGLIB等,允许程序员在运行时动态修改类的字节码,实现AOP(面向切面编程)和代码注入等功能。 7. **安全性**:Java的字节码验证机制确保了字节码的安全性,...
Java字节码增强技术是Java开发中的一种高级技巧,它允许开发者在程序运行时动态修改类的字节码,从而实现一些特殊的功能,比如AOP(面向切面编程)、性能监控、事务管理等。协程是一种轻量级的线程,它在执行过程中...
Java 字节码理解为 JVM 能够识别的机器语言,它是 Java 源代码经过编译后的产物。每个字节码指令对应一个特定的操作,比如 `getstatic` 用于获取静态字段,`ldc` 加载常量,`invokevirtual` 调用虚方法等。JVM 会...
Java字节码是Java虚拟机...总的来说,Java字节码和ASM是Java开发中的高级主题,它们对于理解Java运行机制、实现高性能的代码以及进行动态编程至关重要。通过学习和实践,开发者可以掌握这些技术,提升自己的编程能力。
ASM Java字节码操作框架PPT,结合已有AOP实现方法,对比所有对Java字节码操作方法做比较
Java字节码是Java平台的...通过学习这些内容,开发者可以掌握Java字节码的基本操作,并利用BCEL在实际项目中实现高级功能。同时,这也是一种深入理解JVM工作原理的方式,有助于提升Java编程的技能和对底层机制的理解。
通过这样的方式,ASM可以帮助我们深入理解Java字节码,同时也为我们提供了强大的工具来实现动态代码生成,这对于实现诸如AOP这样的高级编程模式至关重要。在实际项目中,ASM通常与其他工具结合使用,如CGLIB或Byte...
Java字节码工程工具包,通常被称为Javassist,是一个开源项目,专为Java开发者提供了一种方便的方式来处理和操作字节码。Javassist在Java应用开发中扮演着重要的角色,尤其是在动态代理、AOP(面向切面编程)以及...
2. CGLIB库:当目标类没有实现接口时,CGLIB库可以通过字节码操作生成子类实现动态代理。 现在,我们转向"AOP(面向切面编程)"。AOP是Spring框架的核心特性之一,它允许我们将关注点(如日志、事务管理、安全检查...
**JAVA字节码操作库 BCEL** BCEL(Byte Code Engineering Library)是Java平台上的一款开源库,主要用于处理Java字节码。它提供了对字节码的解析、创建、修改和分析的能力,使得开发者能够深入理解并操作Java类文件...
对于有具体实现类的情况,可能需要使用其他AOP框架,比如Spring AOP,它基于字节码操作,能处理接口和类,功能更加强大和灵活。 总之,Java动态代理提供了一种在运行时创建代理类并实现AOP的方法,它可以帮助我们...
JAVA字节码编辑工具,正如其标题所示,是一种专门用于编辑Java字节码的软件。在Java编程语言中,源代码被编译成字节码(.class文件),这是一种平台无关的中间表示形式,可以在Java虚拟机(JVM)上运行。这个工具...
Java字节码是Java虚拟机(JVM)执行的二进制代码,它是由Java源代码编译而成。每条字节码指令都是一个单字节的操作码,后面可能跟随零个或多个操作数。字节码是平台无关的,使得Java应用程序可以在任何支持JVM的设备...