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中代理对象的生成也是运用 ...
随机推荐
- Ubuntu侧边任务栏自动隐藏
设置>>Dock>>{自动隐藏Dock}选项打开
- idea创建web项目教程
官网下载idea,安装配置好后,双击进来,第一次创建项目时新建是这样的 第一步: 第二步:创建项目名和项目存放的路径 点finish进入这里 第三步: 第二步点OK进入这个页面,点上面那个加号 ...
- [2017BUAA软工助教]团队beta得分总表
一.累计得分 项目 α例会 α发布 α测试 α展示 α事后 合计 满分 50 10 10 150 10 230 hotcode5 50 10 9 150 9 228 弗朗明哥舞步 50 10 8 13 ...
- Linux实验报告
第一次链接: http://www.cnblogs.com/L1nke/p/4966820.html 第二次链接: http://www.cnblogs.com/L1nke/p/4992758.htm ...
- c# dataGridView 表头格式设置不管用
解决办法: EnableHeaderVisualStyles设为false
- 配置HugePage
翻译自https://www.thegeekdiary.com/centos-rhel-67-how-to-configure-hugepages/ 什么是HugePage HugePages是Lin ...
- 云平台项目--学习经验--jsrender前端渲染模板
jsrender的好处:可以预先自定义一些固定的html标签,在需要显示数据的时候,可以直接传入真实的数据并显示在web页面中,避免了Js编写中的复杂过程:针对高性能和纯字符串渲染并优化,不需要依赖D ...
- WC----命令行实现对文件信息的统计
需求分析: 程序处理用户需求的模式为: wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数与程序交互,需实现的功能如下: 1.基本功能 支持 -c ...
- T检验在项目上的具体实施
我觉得 T 检验,应该用在 判断某种仿真条件因素 对碳纳米管的随机性 是否有显著影响 上.所以不是针对<相同仿真条件对不同源的影响>这个表中的数据做 T 检验 如:判断 金属/半导体比率 ...
- 技术分享会:深度学习Deep Leanring
作为宴会的散席,技术老大给大家分享了:Deep Leanring Machine Learning是Deep Learning的一个超集. Deep Leanring,依赖于神经网络,当前的技术优势是 ...