精华内容
下载资源
问答
  • 使用Javassist(一个自定义的Gradle插件)来实现自动try-catch 用Javassist实现AOP思想,达到一个注解即可自动加try-catch的目的,当然,AOP的应用场景还有很多,这里抛砖引玉,希望给大家一些参考。 一,通过本...
  • javassist-3.23.1-GA.rar

    2020-03-11 19:59:17
    这个是javassist-3.23.1-GA.jar,因为已经有资源,不得不放在文件夹里重新打包。下载个752KB的jar包花了我十几分钟,看不过去要14积分才能下的那个,所以我0积分提供下载
  • javassist-3.18.0-GA.jar

    2020-06-04 15:52:48
    javassist-3.18.0-GA.jar
  • javassist-3.21.0-GA.jar

    2019-07-13 22:20:25
    jar包分享系列——javassist-3.21.0-GA.jar——下载。分享使我快乐,大家好才是真的好,请大家放心下载。
  • Android代码-javassist

    2019-08-06 02:57:18
    Javassist version 3 Copyright (C) 1999-2018 by Shigeru Chiba, All rights reserved. Javassist (JAVA programming ASSISTant) makes Java bytecode manipulation simple. It is a class library for editing ...
  • Javassist 提供了java类库,用于方便操控Java字节码。功能包括:运行时创建java class,修改class。与其他同类工具(asm等)不同的是,Javassist提供了两个层面的API: 1.java代码层 2.字节码层 通过java代码层,...
  • javassist是一个动态生成字节码的框架,生成的字节码可以输出或实时加载到jvm。文档内容全面。
  • Javassistjar包

    2015-11-17 21:14:20
    它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。 关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解...
  • javassist-3.20.0-GA.zip

    2018-10-23 18:09:47
    修改class的工具类,解压后maven工程导入,可以使用jdk8。此版本之后的版本都是使用的jdk9。
  • Javassist.jar是一个可以执行字节码操作的函数库,可是尽管如此,它却是简单而便与理解的。他允许开发者对自己的程序自由的执行字节码层的操作,当然了,你并不需要对字节码有多深的了解,或者,你根本就不需要了解...
  • javassist-3.11.0.GA.jar.zip

    2020-02-02 10:53:55
    java jar包,亲测试可用 安全,可以对其进行数字签名,只让能够识别数字签名的用户使用里面的东西。 加快下载速度; 压缩,使文件变小,与ZIP压缩机制完全相同。 ...能够让JAR包里面的文件依赖于统一版本的类文件。...
  • javassist-3.18.1-GA.jar.zip

    2020-02-02 10:49:25
    java jar包,亲测试可用 安全,可以对其进行数字签名,只让能够识别数字签名的用户使用里面的东西。 加快下载速度; 压缩,使文件变小,与ZIP压缩机制完全相同。 ...能够让JAR包里面的文件依赖于统一版本的类文件。...
  • Javassist (Java Programming Assistant) makes Java bytecode manipulation simple. It is a class library for editing bytecodes in Java; it enables Java programs to define a new class at runtime and to ...
  • javassist.jar

    2019-10-11 16:38:10
    Javassist version 3,2019年最新版本的javasssit工具,亲测可用,可以直接修改class文件。不需要反编译
  • 《Droidassist》安卓系统的安卓系统,Javassist。机器人助手提供了一种更加轻量,简单易用,无侵入,可配置化的字节码操作方式,你不需要 Java 字节码的相关知识,只需要在 Xml 插件配置中添加简单的 Java 代码即可...
  • javassist-rel_3_23_1_ga

    2018-10-21 15:44:10
    javassist或许可以帮助到正在学习java的初学者,可以使用。
  • javassist-3.18.1-GA.jar

    2018-03-06 17:09:04
    javassist-3.18.1-GA.jar的源码,适用于hibernate框架
  • javassist-3.7.ga.jar下载

    2018-06-14 04:33:13
    javassist-3.7jia包的下载
  • 概述Javassist是一款字节码编辑工具,可以直接编辑和生成Java生成的字节码,以达到对.class文件进行动态修改的效果。
  • javassist-3.18.0-ga.jar

    2015-11-25 13:53:30
    Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作...
  • NULL 博文链接:https://xuliangjun.iteye.com/blog/1063454
  • NULL 博文链接:https://bijian1013.iteye.com/blog/2382393
  • javassist-3.7.ga.jar

    2019-04-02 14:48:16
    Struts2.2版本以上容易出现异常以及解决问题所需jar包
  • 主要介绍了Eclipse下Javassist正确使用方法代码解析,javassist-3.15.0-ga.jar包是一款在java开发中十分重要的jar文件包,需要的朋友可以参考下,文中附下载链接。
  • java6string源码Java 动态代理 动态代理是 Java 开发人员生成代理对象的有用...ASM、Javassist、ByteBuddy、CGLIB 和传统 JDK 动态代理的特定代码生成创建者。 ObjectInvoker是定义方法行为的地方。 createInvokerProx
  • javassist

    2017-09-07 13:08:42
    Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 ...它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"A

    原文地址:http://www.tianshouzhi.com/api/tutorials/bytecode/354

    Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。

    Javassist的官方网站:http://jboss-javassist.github.io/javassist/

     通过javasssit,我们可以:

    • 动态创建新类或新接口的二进制字节码

    • 动态扩展现有类或接口的二进制字节码(AOP)

    1、动态创建新类或新接口的二进制字节码

    假设我们需要生成一个User类:

     
    1. package com.tianshouzhi;
    2.  
    3. public class User {
    4.     private String name;
    5.  
    6.     public User(String name) {
    7.         this.name = name;
    8.     }
    9.  
    10.     public User() {
    11.     }
    12.  
    13.     public String getName() {
    14.         return name;
    15.     }
    16.  
    17.     public void setName(String name) {
    18.         this.name = name;
    19.     }
    20.  
    21.     @Override
    22.     public String toString() {
    23.         return "name="+name;
    24.     }
    25. }

    javassist创建代码如下:

     
    1. package com.tianshouzhi;
    2.  
    3. import javassist.*;
    4.  
    5. import java.lang.reflect.Constructor;
    6. import java.lang.reflect.Method;
    7.  
    8. public class UserGenerator {
    9.     public static void main(String[] args) throws Exception {
    10.         ClassPool classPool = ClassPool.getDefault();
    11.         //定义User类
    12.         CtClass ctClassUser = classPool.makeClass("com.tianshouzhi.User");
    13.  
    14.         //定义name字段
    15.         CtClass fieldType = classPool.get("java.lang.String");//字段类型
    16.         String name = "name";//字段名称
    17.         CtField ctFieldName=new CtField(fieldType, name,ctClassUser);
    18.         ctFieldName.setModifiers(Modifier.PRIVATE);//设置访问修饰符
    19.         ctClassUser.addField(ctFieldName, CtField.Initializer.constant("javasssit"));//添加name字段,赋值为javassist
    20.  
    21.         //定义构造方法
    22.         CtClass[] parameters = new CtClass[]{classPool.get("java.lang.String")};//构造方法参数
    23.         CtConstructor constructor=new CtConstructor(parameters,ctClassUser);
    24.         String body = "{this.name=$1;}";//方法体 $1表示的第一个参数
    25.         constructor.setBody(body);
    26.         ctClassUser.addConstructor(constructor);
    27.  
    28.         //setName getName方法
    29.         ctClassUser.addMethod(CtNewMethod.setter("setName",ctFieldName));
    30.         ctClassUser.addMethod(CtNewMethod.getter("getName",ctFieldName));
    31.  
    32.         //toString方法
    33.         CtClass returnType = classPool.get("java.lang.String");
    34.         String methodName = "toString";
    35.         CtMethod toStringMethod=new CtMethod(returnType, methodName, null,ctClassUser);
    36.         toStringMethod.setModifiers(Modifier.PUBLIC);
    37.         String methodBody = "{return \"name=\"+$0.name;}";//$0表示的是this
    38.         toStringMethod.setBody(methodBody);
    39.         ctClassUser.addMethod(toStringMethod);
    40.  
    41.         //代表class文件的CtClass创建完成,现在将其转换成class对象
    42.         Class clazz = ctClassUser.toClass();
    43.         Constructor cons = clazz.getConstructor(String.class);
    44.         Object user = cons.newInstance("wangxiaoxiao");
    45.         Method toString = clazz.getMethod("toString");
    46.         System.out.println(toString.invoke(user));
    47.  
    48.         ctClassUser.writeFile(".");//在当前目录下,生成com/tianshouzhi/User.class文件
    49.     }
    50. }

    运行程序后输出:

    name=wangxiaoxiao

    通过反编译工具(例如:JD-gui )打开User.class 可以看到类似以下代码:

    Image.png

    2.  动态扩展现有类或接口的二进制字节码(AOP)

    假设我们现在有如下一个类

     
    1. package com.tianshouzhi;
    2.  
    3. public class Looper {
    4.     public void loop(){
    5.         try {
    6.             System.out.println("Looper.loop() invoked");
    7.             Thread.sleep(1000L);
    8.         } catch (InterruptedException e) {
    9.             e.printStackTrace();
    10.         }
    11.     }
    12. }

    现在我们想统计Looper的loop方法的耗时时间。最简单的思路是使用javassist修改loop方法的源码:

    在最前加入:long start=System.currentTimeMillis();

    在最后插入:System.out.println("耗时:"+(System.currentTimeMillis()-start)+"ms");

    如下:

     
    1. public class Looper {
    2.  
    3.     public void loop(){
    4.  
    5.         //记录方法调用的开始时间
    6.  
    7.         long start=System.currentTimeMillis();
    8.  
    9.         try {
    10.  
    11.             System.out.println("Looper.loop() invoked");
    12.  
    13.             Thread.sleep(1000L);
    14.  
    15.         } catch (InterruptedException e) {
    16.  
    17.             e.printStackTrace();
    18.  
    19.         }
    20.  
    21.         //方法结束时打印耗时
    22.  
    23.         System.out.println("耗时:"+(System.currentTimeMillis()-start)+"ms");
    24.  
    25.     }
    26.  
    27. }

    javassist的CtClass方法提供的insertBefore和insertAfter方法,允许我们在一个方法开始和结束添加自己的代码。

     
    1. public class JavassisTimingWrong {
    2.  
    3.     public static void main(String[] args) throws Exception {
    4.  
    5.         //需要修改的已有的类名和方法名
    6.  
    7.         String className="com.tianshouzhi.javassist.Looper";
    8.  
    9.         String methodName="loop";
    10.  
    11.         ClassPool classPool = ClassPool.getDefault();
    12.  
    13.         CtClass clazz = classPool.get(className);
    14.  
    15.         CtMethod method = clazz.getDeclaredMethod(methodName);
    16.  
    17.         method.insertBefore("long start=System.currentTimeMillis();");
    18.  
    19.         method.insertAfter("System.out.println(\"耗时:\"+(System.currentTimeMillis()-start)+\"ms\");");
    20.  
    21.         //调用修改的Looper类的loop方法
    22.  
    23.         Looper looper = (Looper) clazz.toClass().newInstance();
    24.  
    25.         looper.loop();
    26.  
    27.     }
    28.  
    29. }

    此时:

    因此运行时,会爆出类似以下的错

    Image.png

    这是因为,javassist插入的代码片段中,每次插入操作的代码,称之为一个插入代码块,后面的插入块不能使用前面的插入块定义的局部变量,而言且也不能使用方法中的原有局部变量。而上述代码中,我们分表调用了insertBefore和insertAfter插入了两个代码块,而后面的插入块不能使用前面的插入块定义的局部变量start,因此爆出了上面的错。

    而如果代码片段都位于一个插入块中,则局部变量是可以引用的。因此考虑使用如下的方法实现:

    具体的思路是:将原有的loop方法名改为loop$impl,然后再定义一个loop方法,新的loop方法内部会调用loop$impl,在调用之前和调用之后分别加入上述的代码片段。

    实现如下:

     
    1. package com.tianshouzhi;
    2.  
    3. import javassist.ClassPool;
    4. import javassist.CtClass;
    5. import javassist.CtMethod;
    6. import javassist.CtNewMethod;
    7.  
    8. public class JavassisTiming {
    9.     public static void main(String[] args) throws Exception{
    10.         //需要修改的已有的类名和方法名
    11.         String className="com.tianshouzhi.Looper";
    12.         String methodName="loop";
    13.  
    14.         //修改为原有类的方法名为loop$impl
    15.         CtClass clazz = ClassPool.getDefault().get(className);
    16.         CtMethod method = clazz.getDeclaredMethod(methodName);
    17.         String newname = methodName + "$impl";
    18.         method.setName(newname);
    19.  
    20.         //使用原始方法名loop,定义一个新方法,在这个方法内部调用loop$impl
    21.         CtMethod newMethod = CtNewMethod.make("public void "+methodName+"(){" +
    22.                         "long start=System.currentTimeMillis();" +
    23.                         ""+newname+"();" +//调用loop$impl
    24.                         "System.out.println(\"耗时:\"+(System.currentTimeMillis()-start)+\"ms\");" +
    25.                         "}"
    26.                 , clazz);
    27.         clazz.addMethod(newMethod);
    28.  
    29.         //调用修改的Looper类的loop方法
    30.         Looper looper = (Looper) clazz.toClass().newInstance();
    31.         looper.loop();
    32.     }
    33. }

    输出:

    Looper.loop() invoked耗时:1000ms

    此外还有一种更加简单的方式

     
    1. package com.tianshouzhi;
    2.  
    3. import javassist.util.proxy.MethodFilter;
    4. import javassist.util.proxy.MethodHandler;
    5. import javassist.util.proxy.ProxyFactory;
    6.  
    7. import java.lang.reflect.Method;
    8.  
    9. public class JavassistAop {
    10.     public static void main(String[] args) throws IllegalAccessException, InstantiationException {
    11.         ProxyFactory factory=new ProxyFactory();
    12.         //设置父类,ProxyFactory将会动态生成一个类,继承该父类
    13.         factory.setSuperclass(Looper.class);
    14.         factory.setFilter(new MethodFilter() {
    15.             @Override
    16.             public boolean isHandled(Method m) {
    17.                 if(m.getName().equals("loop")){
    18.                     return true;
    19.                 }
    20.                 return false;
    21.             }
    22.         });
    23.         //设置拦截处理
    24.         factory.setHandler(new MethodHandler() {
    25.             @Override
    26.             public Object invoke(Object self, Method thisMethod, Method proceed,
    27.                                  Object[] args) throws Throwable {
    28.                 long start=System.currentTimeMillis();
    29.                 Object result = proceed.invoke(self, args);
    30.                 System.out.println("耗时:"+(System.currentTimeMillis()-start)+"ms");
    31.                 return result;
    32.             }
    33.         });
    34.         Class<?> c=factory.createClass();
    35.         Looper object=(Looper) c.newInstance();
    36.         object.loop();
    37.     }
    38. }

    展开全文
  • Javassist代码注入

    2018-10-15 19:19:34
    javassist实现代码注入,详细内容可以参考;https://blog.csdn.net/xiangzhihong8/article/details/83060674
  • javassist-3.27.0-GA.jar

    2020-07-25 18:14:05
    javassist-3.27.0-GA.jar

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,623
精华内容 9,449
关键字:

javassist

java 订阅