jdk 动态代理实现对目标对象的增强
因为学习 spring框架的 AOP 所以,这里复习下动态代理,但是 spring 的底层动态代理实现是 cglib,jdk 这种呢可以引导新手入门
spring AOP 横向抽取机制 最典型的应用当属 log ,transaction 了,具体可以从配置文件的配置以及注解看出
首先基于 jdk 的动态代理需要借助于
jdk 中 reflect 包下(java.lang.reflect.Proxy)的 Proxy
以及(java.lang.reflect.InvocationHandler) InvacationHandler
去生成代理对象。
局限性是这种动态代理只适用于对有接口的类实现动态代理
原理其实是,利用反射机制先生成要被代理对象的同级对象然后对这个同级对象进行增强
所以这里需要传入接口
下面是代码部分详解:
首先我们定义一个简单的 动物接口 IAnimal 里面有一个简单方法 move
package com.ghc.test; public interface IAnimal {
void move();
}
com.ghc.test.IAnimal
然后呢,我们定义一个要被代理的类 Cat,这个类实现了 IAnimal 接口
package com.ghc.test; public class Cat implements IAnimal {
@Override
public void move() {
System.out.println("cat run...");
}
}
com.ghc.test.Cat
接下来就是我们 处理器的定义了,这个唤醒处理器呢有个规范就是必须实现 接口 java.lang.reflect.InvocationHandler;
覆写里面的 invoke 方法,并且在 invoke 方法中做我们的增强,具体代码如下:
package com.ghc.test; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class AnimalInvocationHandler implements InvocationHandler {
// 定义要被代理的类
private Object tar;
public AnimalInvocationHandler(Object tar){
this.tar=tar;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("前置增强处......");
Object result = method.invoke(tar,args);
System.out.println("后置增强处......");
return result;
}
public Object getProxyInstance(){
return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),tar.getClass().getInterfaces(),this);
}
}
com.ghc.test.AnimalInvocationHandler
当然,上面其中一个方法 getProxyInstance 其实是可以定义在使用的地方的。这都不是重点
重点来了,就是我们如何使用呢:
import com.ghc.test.AnimalInvocationHandler;
import com.ghc.test.Cat;
import com.ghc.test.IAnimal;
import org.junit.Test; public class DynamicProxyTest {
@Test
public void testCatProxy(){
//先创建要被代理的对象
Cat cat = new Cat();
AnimalInvocationHandler animalInvocationHandler=new AnimalInvocationHandler(cat);
IAnimal catProxy = (IAnimal) animalInvocationHandler.getProxyInstance();
catProxy.move();
}
}
DynamicProxyTest
结果如图:
jdk 动态代理实现对目标对象的增强的更多相关文章
- jdk动态代理 要把目标对象 和自己都传进去;以便自己对目标对象的代理
- java jdk动态代理模式举例浅析
代理模式概述 代理模式是为了提供额外或不同的操作,而插入的用来替代”实际”对象的对象,这些操作涉及到与”实际”对象的通信,因此代理通常充当中间人角色. java中常用的动态代理模式为jdk动态代理和c ...
- Java的三种代理模式:静态代理/JDK动态代理/Cglib动态代理
1.静态代理:需要定义接口或者父类,目标对象与代理对象均实现同一接口或继承同一父类. 2.JDK动态代理:需要目标对象实现一个接口,通过动态反射的机制,生成代理对象,实现同一个接口 3.Cglib动态 ...
- 获取JDK动态代理/CGLIB代理对象代理的目标对象。
问题描述:: 我现在遇到个棘手的问题,要通过spring托管的service类保存对象,这个类是通过反射拿到的,经过实验发现这个类只能反射取得sservice实现了接口的方法,而extends类的方法 ...
- Spring中的JDK动态代理
Spring中的JDK动态代理 在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在动态代理是实现AOP的绝好底层 ...
- Spring AOP详解 、 JDK动态代理、CGLib动态代理
AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码 ...
- JDK动态代理与Cglib库
JDK动态代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在 ...
- JDK动态代理实现原理--转载
之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白.比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的,直到前几个星期才把这些问题全部搞明白了. ...
- Spring AOP高级——源码实现(3)AopProxy代理对象之JDK动态代理的创建过程
spring-aop-4.3.7.RELEASE 在<Spring AOP高级——源码实现(1)动态代理技术>中介绍了两种动态代理技术,当然在Spring AOP中代理对象的生成也是运用 ...
随机推荐
- CSS技巧收集——巧用滤镜
最近暴雪一款叫<守望先锋>的游戏火到不行,身边很多人都深受其毒害,虽然博主自己没有买(穷),但是耳濡目染也了解了个大概. 由于之前大致学习了一下 css 滤镜的各种用法,所以心血来潮结合二 ...
- 余玄相似度,TF-IDF
能干什么? 文章去重,语句去重,提取关键词(文章摘要,页面指纹),图片识别,语音识别 想要做一个相似度,最重要的是什么? 必须得到一个度量:计算个体之间的相似程度(分数,0-1之间,0代表完全不同,一 ...
- idou老师教你学istio :基于角色的访问控制
istio的授权功能,也称为基于角色的访问控制(RBAC),它为istio服务网格中的服务提供命名空间级别.服务级别和方法级别的访问控制.基于角色的访问控制具有简单易用.灵活和高性能等特性.本文介绍如 ...
- 《Linux内核分析》课程第二周学习总结
姓名:何伟钦 学号:20135223 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- C语言版本:单链表的实现(优化版本)
未优化版本:http://www.cnblogs.com/duwenxing/p/7569376.html slist.h #ifndef __SLIST_H__ #define __SLIST_H_ ...
- LeetCode-----算法448.找到所有数组中消失的数字
题目: 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. ...
- 第一个spring,第五天。
陈志棚:界面跳转与框架 李天麟:游戏界面ui 徐侃:算法代码的设计 经过五天的时间,经过队员的汇报,我们初步已经完成了各项的任务.
- 小学四则运算APP 第一个冲刺阶段 第三天
团队成员:陈淑筠.杨家安.陈曦 团队选题:小学四则运算APP 第一次冲刺阶段时间:11.17~11.27 本次发布是在与团队成员解决了昨天问题的基础上,再增加了几个界面,增加了一些功能,修改与增加的代 ...
- 使用Samba服务程序,让linux系统之间共享文件
yum install -y cifs-utils mkdir /database 创建挂载目录 在root家目录创建认证文件(依次为SMB用户名.SMB用户密码.SMB共享域) v ...
- vmEsxi一些使用
打开esxi的shell:在故障检查选项中 回车,打开shell ALT+F1进入esxi的shell ALT+F2返回 精简置备--用多少占多少,上限为设置的磁盘大小 虚机扩容:1.原本的扩容2.添 ...