Java动态代理的两种实现方式:
方式一:传统的代理
package cn.hc.domain; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; /**
* 代理对象创建的工厂类
* @author hc
*
*/
public class JDKProxyFactory implements InvocationHandler{
//被代理对象
private Object target;
public JDKProxyFactory(Object target){
this.target=target;
}
//创建代理
public Object createProxy(){
//三个参数:类加载器 实现接口 invocationHandler
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
public Object invoke(Object arg0, Method arg1, Object[] arg2)
throws Throwable {
// TODO Auto-generated method stub
//调用目标真是的方法
System.out.println("日志已经被记录");
return arg1.invoke(target, arg2);
}
}
此种方法的缺陷在于:被代理的类必须实现接口
package cn.hc.domain;
//代理对象的接口
public interface UserDao {
public void save();
public void update();
}package cn.hc.domain;
/**
* 被代理的目标对象
* @author hc
*
*/
public class UserDaoImpl implements UserDao { public void save() {
// TODO Auto-generated method stub
System.out.println("添加用户");
} public void update() {
// TODO Auto-generated method stub
System.out.println("更新用户");
} }
//测试类package cn.hc.domain; import org.junit.Test; public class TestProxy {
@Test
public void testJdkProxy(){
//测试jdk动态代理
//1真实目标对象
UserDao userDao=new UserDaoImpl();
//System.out.println(userDao);
UserDao proxy=(UserDao) new JDKProxyFactory(userDao).createProxy();
proxy.save();
proxy.update();
}
}
测试结果:
日志已经被记录
添加用户
日志已经被记录
更新用户
方式2:cglib动态代理
package cn.hc.cglibProxy; import java.lang.reflect.Method; import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy; public class CGlibProxyFactory implements MethodInterceptor{
private Object target;
public CGlibProxyFactory(Object target){
this.target=target;
}
//创建代理对象的方法
public Object createProxy() {
//创建Enhance对象
Enhancer enhancer=new Enhancer();
//cglib创建代理,对目标对象创建子类对象
enhancer.setSuperclass(target.getClass());
//传入callback对象,对目标增强
enhancer.setCallback(this);
return enhancer.create();
}
//arg3 用于执行父类的方法
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {
// TODO Auto-generated method stub
System.out.println("开始记录日志");
return arg1.invoke(target,arg2);
}
}
package cn.hc.cglibProxy;
public class ProductDao {
public void add(){
System.out.println("添加");
}
public void delete(){
System.out.println("删除");
}
}
//测试方法
package cn.hc.cglibProxy;
import org.junit.Test;
public class CGlibTest {
@Test
public void test1(){
//创建目标对象
ProductDao dao=new ProductDao();
ProductDao proxy=(ProductDao) new CGlibProxyFactory(dao).createProxy();
proxy.add();
proxy.delete();
}
}
Java动态代理的两种实现方式:的更多相关文章
- 动态代理的两种实现方式(JDK/Cglib)
=========================================== 原文链接: 动态代理的两种实现方式(JDK/Cglib) 转载请注明出处! ================== ...
- java动态代理的两种方法
动态代理,有两种情况,第一种是有接口的情况下,你可以选择为jdk自带的动态代理的方式来编写程序,但你想要为一个实在的类编写动态代理的方式的话,这时候就必须选择一些开源的lib包,如cglib包,同时还 ...
- java动态代理的2种实现方式
java的动态代理在接java的api上有说明,这里就不写了.我理解的代理: 对特定接口中特定方法的功能进行扩展,这就是代理.代理是通过代理实例关联的调用处理程序对象调用方法. 下面通过一个例子看一下 ...
- Java动态代理的两种实现方法
注:文章转载自:https://blog.csdn.net/m0_38039437/article/details/77970633 一.代理的概念 动态代理技术是整个java技术中最重要的一个技术, ...
- Java中String对象两种赋值方式的区别
本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过“字面量”赋值 ...
- 细说java中Map的两种迭代方式
曾经对java中迭代方式总是迷迷糊糊的,今天总算弄懂了.特意的总结了一下.基本是算是理解透彻了. 1.再说Map之前先说下Iterator: Iterator主要用于遍历(即迭代訪问)Collecti ...
- 动态代理的两种方式,以及区别(静态代理、JDK与CGLIB动态代理、AOP+IoC)
Spring学习总结(二)——静态代理.JDK与CGLIB动态代理.AOP+IoC 目录 一.为什么需要代理模式 二.静态代理 三.动态代理,使用JDK内置的Proxy实现 四.动态代理,使用cg ...
- Java中容器的两种初始化方式比较
List,Set,Map的两种初始化赋值方式 List List<Integer> list2 = new ArrayList<Integer>(); for (int i= ...
- Java实现动态代理的两种方式
http://m.blog.csdn.net/article/details?id=49738887
随机推荐
- HSV色彩空间
HSV是把H(色相),S(饱和度),V(亮度)当做色值来定位颜色的空间.色相的取值范围是0~360度,用来表示颜色的类别.其中红色是0度,绿色是120度,蓝色是240度.饱和度的取值范围是0%~100 ...
- lsof 一切皆文件
Docs » 工具参考篇 » 3. lsof 一切皆文件 Docs » 工具参考篇 » 3. lsof 一切皆文件 Edit on GitHub 3. lsof 一切皆文件¶ lsof(list op ...
- c#组元(Tuple)的使用
组元(Tuple)是C# 4.0引入的一个新特性,可以在.NET Framework 4.0或更高版本中使用.组元使用泛型来简化类的定义,多用于方法的返回值.在函数需要返回多个类型的时候,就不必使用o ...
- yii2知识点详解
yii2错误处理机制: 错误处理器将所有非致命PHP错误转换成可获取异常, 也就是说可以使用如下代码处理PHP错误 use Yii; use yii\base\ErrorException; try ...
- Web性能API——帮你分析Web前端性能
前端性能统计必备api,有不知道的吗? 正文从这开始- 开发一个现代化的互联网网站是一项复杂的任务,需要各种职能的密切合作以应对用户日新月异的需求.其中,网页的性能直接决定了用户的体验,而随着新型客户 ...
- [curator] Netflix Curator 使用
curator简介 Netflix curator 是Netflix公司开源的一个Zookeeper client library,用于简化zookeeper客户端编程,包含一下几个模块: curat ...
- Windows Server 2008 R2 创建辅助DNS服务器并接管主要DNS服务器
公司需求: Zhuyu公司局域网有一台主要DNS服务器,经领导讨论需要规划安装一台辅助DNS服务器备用. 功能需求: 当主要DNS服务器宕机或系统崩溃,辅助DNS服务器能接管主要DNS服务器工作,并且 ...
- 安装eclipse的hadoop开发环境
eclipse:安装路径/usr/local/eclipse hadoop-2.5.2 /usr/local/hadoop/hadoop-2.5.2 hadoop2x-eclipse-plugin-m ...
- Java Servlet(七):JavaWeb MVC 操作(jdk7+tomcat7+eclipse)
之前一段时间一直忙于毕业设计,也没有空学习了,本篇继续学习. 本篇将开始学习java web下使用servlet下来操作数据库,并展示到界面上的使用方法. 新建工程ServletMvc001. 目录结 ...
- svg学习(七)polygon
<polygon> 标签用来创建含有不少于三个边的图形. <?xml version="1.0" standalone="no"?> & ...