动态代理:cgib、jdk、java javassist
时间:2022-07-24
本文章向大家介绍动态代理:cgib、jdk、java javassist,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
代理:即为访问对象添加一层控制层,使其间接化,控制层可以为对象访问添加操作属性。
一、cglib:Code Generation library
- 基于ASM(java字节码操作码)的高性能代码生成包
- 被许多AOP框架使用
- 区别于JDK动态代理,cglib不需要实现接口。
实例:
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class MyMethodInterceptor implements MethodInterceptor {
public String myFun(String arg){
return "hello," + arg ;
}
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
String methodName = method.getName();
System. out .println( "[intercept] fun invoked before" );
String result = (String)args[0] + "..." ;
System. out .println( result );
System. out .println( "[intercept] fun invoked after" );
return result;
}
public Object createProxy(){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(MyMethodInterceptor. class );
enhancer.setCallback( this );
return enhancer.create();
}
public static void main(String[] args) {
MyMethodInterceptor ss = new MyMethodInterceptor();
MyMethodInterceptor proxy = (MyMethodInterceptor)ss.createProxy();
c1.myFun( "cglib test" );
}
}
通用工具类:
package org.windwant.spring.core.proxy;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* Created by windwant on 2016/6/4.
*/
public class MyCGLIBProxy implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clazz){
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib before action");
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("cglib after action");
return result;
}
}
MyCGLIBProxy p = new MyCGLIBProxy();
Performer pp = (Performer) p.getProxy(XXXX.class);
pp.XXXX();
二、JDK动态代理
package org.windwant.spring.core.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* Created by windwant on 2016/6/4.
*/
public class MyJDKProxy implements InvocationHandler{
private Object targetObject;
public Object getInstance(Object targetObject){
this.targetObject = targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("proxy: before action");
Object resutl = method.invoke(targetObject, args);
System.out.println("proxy: after action");
return resutl;
}
}
MyJDKProxy mp = new MyJDKProxy();
XXX ap = (XXX) mp.getInstance(new APerformer());
ap.XX();
三、Java javassist 动态代理
package org.windwant.spring.core.proxy;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
/**
* Created by windwant on 2016/9/18.
*/
public class MyJavassistProxy {
public Object getProxySelf(String clazz, String pClazz, String methodName, String methodBefore, String methodAfter){
ClassPool cp = ClassPool.getDefault();
CtClass ct;
try {
ct = cp.get(clazz);
if(pClazz != null){
ct.setSuperclass(cp.get(pClazz));
}
ct.writeFile();
ct.defrost();
CtMethod m = ct.getDeclaredMethod(methodName);
if(methodBefore != null) {
m.insertBefore(methodBefore);
}
if(methodAfter != null) {
m.insertAfter(methodAfter);
}
Class c = ct.toClass();
return c.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
public void testJavassist(){
String clazz = "org.windwant.spring.core.proxy.Hello";
String methodBefore = "{ System.out.println("method before...:"); }";
String methodAfter = "{ System.out.println("method after...:"); }";
String pClazz = "org.windwant.spring.core.proxy.HelloP";
Hello hello = (Hello) new MyJavassistProxy().getProxySelf(clazz, null, "say",
methodBefore, methodAfter);
hello.say();
}
- Spring框架(一)
- MyBatis框架(三)动态SQL,分页,二进制存入数据库图片
- Spring框架(二)反射机制, 注入, 单例模式, 自动装载, 延迟加载
- Spring框架(三) JDBCTemplate,声明式事务,自动装载(注解)
- SpringMVC 常用注解
- Spring3:AOP
- js中三目运算符和&& || 符的个人浅见
- 原生js怎么为动态生成的标签添加各种事件
- 实现图片懒加载
- SpringMVC框架(四)文件的上传下载,上下文路径
- SpringMVC框架(一)
- HTML link标签media参数
- Mybatis,Spring,SpringMVC框架面试题
- 腾讯云容器服务集群中安装 dashboard ui
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python实现线性回归之简单回归
- 走进STL - 空间配置器,STL背后的故事
- C++ 智能指针
- python实现线性回归之lasso回归
- 分页查询 offset 和 limit 和 limit 的区别
- mybatis文件映射之获取参数值时#和$的区别
- python实现线性回归之岭回归
- 操作系统实验之存储管理
- MySQL EXPLAIN 的使用
- mybatis文件映射之关联查询初探(一)
- python实现线性回归之弹性网回归
- 【原创】python倒排索引之查找包含某主题或单词的文件
- python实现逻辑回归
- Linux文件管理参考
- CloudBase Framework丨第一个 Deno 部署工具是如何打造的?