javassist实例】的更多相关文章

我们常用到的动态特性主要是反射,在运行时查找对象属性.方法,修改作用域,通过方法名称调用方法等.在线的应用不会频繁使用反射,因为反射的性能开销较大.其实还有一种和反射一样强大的特性,但是开销却很低,它就是Javassist. Javassist其实就是一个二方包,提供了运行时操作Java字节码的方法.Java代码编译完会生成.class文件,就是一堆字节码.JVM(准确说是JIT)会解释执行这些字节码(转换为机器码并执行),由于字节码的解释执行是在运行时进行的,那我们能否手工编写字节码,再由JV…
[简述] Javassist是一个开源的java字节码操作工具,主要是对已经编译好class文件进行修改和处理,可以直接检查.修改.创建 java类. [javassist实例] package com.javassist; import javassist.*; import java.io.File; import java.io.FileOutputStream; import java.lang.reflect.Method; import java.lang.reflect.Modif…
目录 前言 基础知识 Transformer 利用InvokerTransformer造成命令执行 Map TransformedMap LazyMap AnnotationInvocationHandler 动态代理 Commons Collections Gadget 分析 CommonsCollections1 CommonsCollections2 疑问 CommonsCollections3 CommonsCollections4 CommonsCollections5 Commons…
全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 JDK 6+ Eclipse Indigo 和 Juno 报告问题 试验性功能 内部实现类 2. 开始学习 一分钟入门 安装Activiti 安装Activiti数据库 引入Activiti jar和依赖 下一步 3. 配置 创建ProcessEngine ProcessEngineConfigur…
1.读写字节码 Javassist是用来处理java字节码的类库.字节码保存在二进制文件中称为类文件.每个类文件夹包括一个java类或接口. Javasssist.CtClass这个类是一个类文件的抽象表示.一个CtClass(compile-time class编译时类)对象处理一个类文件.下面是个简单的例子: ClassPool pool = ClassPool.getDefault();CtClass cc = pool.get("test.Rectangle");cc.setS…
原文地址:http://blog.csdn.net/ruishenh/article/details/23180707?utm_source=tuicool 1.   概述 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案 主要核心部件 Remoting: 网络通信框架,实现了sync-over-async 和 request-response 消息机制. RPC: 一个远程过程调用的抽象,支持负载均衡.容灾和集群功能 Registry:…
class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中,解析.class 文件内的信息,生成对应的 Class对象: class字节码文件是根据JVM虚拟机规范中规定的字节码组织规则生成的.具体class文件是怎样组织类信息的,可以参考 此博文:深入理解Java Class文件格式系列.或者是Java虚拟机规范. 下面通过一段代…
本系列的 第 4 部分和 第 5 部分讨论了如何用 Javassist 对二进制类进行局部更改.这次您将学习以一种更强大的方式使用该框架,从而充分利用 Javassist 对在字节码中查找所有特定方法或者字段的支持.对于 Javassist 功能而言,这个功能至少与它以类似源代码的方式指定字节码的能力同样重要.对选择替换操作的支持也有助于使 Javasssist 成为一个在标准 Java 代码中增加面向方面的编程功能的绝好工具. 第 5 部分介绍了 Javassist 是如何让您拦截类加载过程的…
讲过了 Java 类格式和利用反射进行的运行时访问后,本系列到了进入更高级主题的时候了.本月我将开始本系列的第二部分,在这里 Java 类信息只不过是由应用程序操纵的另一种形式的数据结构而已.我将这个主题的整个内容称为 classworking. 我将以 Javassist 字节码操作库作为对 classworking 的讨论的开始.Javassist 不仅是一个处理字节码的库,而且更因为它的另一项功能使得它成为试验 classworking 的很好的起点.这一项功能就是:可以用 Javassi…
class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中,解析.class 文件内的信息,生成对应的 Class对象: class字节码文件是根据JVM虚拟机规范中规定的字节码组织规则生成的.具体class文件是怎样组织类信息的,可以参考 此博文:深入理解Java Class文件格式系列.或者是Java虚拟机规范. 下面通过一段代…
1.读取和输出字节码 ClassPool pool = ClassPool.getDefault(); //会从classpath中查询该类 CtClass cc = pool.get("test.Rectangle"); //设置.Rectangle的父类 cc.setSuperclass(pool.get("test.Point")); //输出.Rectangle.class文件到该目录中 cc.writeFile("c://"); //输…
在不少的情况下,我们需要对生产中的系统进行问题排查,但是又不能重启应用,java应用不同于数据库的存储过程,至少到目前为止,还不能原生的支持随时进行编译替换,从这种角度来说,数据库比java的动态性要好得多,而且其随时编译的性能也比其他解释性语言的性能要好的多.虽然如此,我们绝大部分应用都使用java编写,所以还是得尽可能的为随时问题排查做准备,尤其是对于提供行业应用托管的系统来说. 在本文中,主要说下动态重新加载类的实现以及其他替换选择. 默认情况下,当加载了一个类后,再遇到相同的类时,它不会…
Customer类对应的表为另一个表LinkMan的外键,在进行LinkMan表操作时,出现如下错误. 遇到Javassist增强失败网上说法不一,有的说Customer没有无参构造方法,javassist-3.18.1-GA.jar问题,还有的说Tomcat版本问题,但都没有解决. 最终解决的方法是:设置lazy=“false”,还有在web.xml中配置Session的延迟关闭的过滤器(其要在Struts2的过滤器的前面),步骤如下 1.在Customer.hbm.xml中添加如下lazy=…
转载自  斩秋的专栏  http://blog.csdn.net/quhongwei_zhanqiu/article/details/41597219 JavassistProxyFactory:利用字节码技术来创建对象 public <T> T getProxy(Invoker<T> invoker,Class<?>[] interfaces) { return (T) Proxy.getProxy(interfaces).newInstance(new Invoke…
一.SSH框架简介 SSH是struts+spring+hibernate集成的web应用程序开源框架. Struts:用来控制的,核心控制器是Controller. Spring:对Struts和Hibernate进行管理,整合的. Hiernate:操控数据库 struts标签库:Struts2默认的表达式语言是OGNL(Object-Graph Navigation Language),通过它可以存取对象的任意属性.调用对象的方法.遍历整个对象的结构图.实现字段类型转换等功能. JSP:…
JavassistProxyFactory利用自己吗技术构建代理对象的实现如下: public <T> T getProxy(Invoker<T> invoker, Class<?>[] interfaces) { return (T) Proxy.getProxy(interfaces).newInstance(new InvokerInvocationHandler(invoker)); } 看似和使用jdk技术生成代理对象一样,实际上这里的Proxy类不是jdk自…
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com 目录 目录简介基本功能演示运行期修改类原始类修改未加载过的类修改已加载过的类获取类基本信息创建一个新类重新生成类的字节码文件原始类给类添加方法给类添加属性修改类的方法修改注解的值实现动态代理 简介 官网 GitHub WIKI -非常详细 Java bytecode engineering…
javassist的作用是动态生成字节码. package com.zhang; class Fighter {} public class Assist_Test { public static void main_modify(String[] args) throws NotFoundException, CannotCompileException, IOException { //修改已有类,添加name字段.前提是该类没有被加载 ClassPool pool = ClassPool.…
class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中,解析.class 文件内的信息,生成对应的 Class对象: class字节码文件是根据JVM虚拟机规范中规定的字节码组织规则生成的.具体class文件是怎样组织类信息的,可以参考 此博文:深入理解Java Class文件格式系列.或者是Java虚拟机规范. 下面通过一段代…
======================= 本文转载自简书,感谢原作者!. 原链接如下:https://www.jianshu.com/p/b9b3ff0e1bf8 ======================= 4. 自省和自定制 (Introspection and customization) CtClass 提供了自省的方法.Javassist 的自省能力与 Java 反射 API 兼容. CtClass 提供了 getName(),getSuperclass(),getMethod…
======================= 本文转载自简书,感谢原作者!. 原链接如下:https://www.jianshu.com/p/43424242846b ======================= 1. 读写字节码 我们知道 Java 字节码以二进制的形式存储在 class 文件中,每一个 class 文件包含一个 Java 类或接口.Javaassist 就是一个用来处理 Java 字节码的类库. 在 Javassist 中,类 Javaassit.CtClass 表示 c…
class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中,解析.class 文件内的信息,生成对应的 Class对象: class字节码文件是根据JVM虚拟机规范中规定的字节码组织规则生成的.具体class文件是怎样组织类信息的,可以参考 此博文:深入理解Java Class文件格式系列.或者是Java虚拟机规范. 下面通过一段代…
原文地址:http://blog.csdn.net/ruishenh/article/details/23180707?utm_source=tuicool 1.   概述 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案 主要核心部件 Remoting: 网络通信框架,实现了sync-over-async 和 request-response 消息机制. RPC: 一个远程过程调用的抽象,支持负载均衡.容灾和集群功能 Registry:…
一.class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中,解析.class 文件内的信息,生成对应的 Class对象: class字节码文件是根据JVM虚拟机规范中规定的字节码组织规则生成的.具体class文件是怎样组织类信息的,可以参考 此博文:深入理解Java Class文件格式系列.或者是Java虚拟机规范. 下面通过一…
本文介绍一下,当下比较基础但是使用场景却很多的一种技术,稍微偏底层点,就是字节码插庄技术了...,如果之前大家熟悉了asm,cglib以及javassit等技术,那么下面说的就很简单了...,因为下面要说的功能就是基于javassit实现的,接下来先从javaagent的原理说起,最后会结合一个完整的实例演示实际中如何使用. 1.什么是javassist? Javassist是一个开源的分析.编辑和创建Java字节码的类库.其主要的优点,在于简单,而且快速.直接使用java编码的形式,而不需要了…
要想将编译时不存在的类在运行时动态创建并加载,通常有两种策略: 1. 动态编译 2. 动态生成二进制字节码(.class) 对于第二种策略,实际上已经有诸多比较成熟的开源项目提供支持,如CGLib.ASM.Javassist等.这些开源项目通常都具备两方面的功能: 1. 动态创建新类或新接口的二进制字节码 2. 动态扩展现有类或接口的二进制字节码 其中,CGLib的底层基于ASM实现,是一个高效高性能的生成库:而ASM是一个轻量级的类库,但需要涉及到JVM的操作和指令:相比而言,Javassis…
前言 JDK,CGLIB,JAVASSIST是常用的动态代理方式. JDK动态代理仅能对具有接口的类进行代理. CGLIB动态代理方式的目标类可以没有接口. Javassist是一个开源的分析.编辑和创建Java字节码的类库,JAVASSIST可以动态修改类,比如添加方法和属性.JAVASSIST的目标类也没有接口限制. 动态代理常用在RPC接口调用中,因此选择一个好的动态代理方式,会对系统性能有一定的提升. 对于代码的性能测试,常规的方法如下,如此是无法获取到准确的性能数据的 long sta…
一.背景介绍 1.需求说明 需求是在程序运行期间,向某个类的某个方法前.后加入某段业务代码,或者直接替换整个方法的业务逻辑,即业务方法客制化.注意是运行期间动态更改,做到无侵入,而不是事先在代码中写死切入点或逻辑. 拿到这个需求,首先想到的是使用 spring aop 技术,但这种方式需要事先在方法上加注解进行拦截,可我们在服务启动前并不知道要拦截哪些方法.或者直接拦截所有方法,但这样或多或少都会有一些性能问题,每次方法调用时,都会进入切面,需要判断是否需要对这个方法做客制化,而判断的规则以及客…
本文译自Getting Started with Javassist,如果谬误之处,还请指出. bytecode读写 ClassPool Class loader 自有和定制 Bytecode操控接口 Generics Varargs J2ME 装箱和拆箱 调试 1. bytecode读写 Javassist是用来处理java字节码的类库, java字节码一般存放在后缀名称为class的二进制文件中.每个二进制文件都包含一个java类或者是java接口. Javasist.CtClass是对类文…
在服务(本地和远程)暴露的时候会调用proxyFactory.getInvoker方法 具体位置: 本地暴露:ServiceConfig#exportLocal line:538 远程暴露: ServiceConfig#doExportUrlsFor1Protocol line:512 会先调用AOP织入的类StubProxyFactoryWrapper#getInvoker 然后执行JavassistProxyFactory#getInvoker JavassistProxyFactory#g…