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
随机推荐
- Socket客户端/服务端简单实例
1.client端 package demo.socket; import java.io.BufferedReader;import java.io.IOException;import java. ...
- Web前端开发基础 第四课(CSS元素分类)
元素分类 在讲解CSS布局之前,我们需要提前知道一些知识,在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素.内联元素(又叫行内元素)和内联块状元素. 常用的块状元素有: <di ...
- Server.UrlEncode与Server.UrlDecode(url传递中文的解决方案)
1.设置web.config文件.<system.web> ...... <globalization requestEncoding="gb2312" resp ...
- BizTalk开发系列(二十九) 宏的使用
在BizTalk中可以使用宏集合动态的让BizTalk发送处理程序使用单独的值来替换宏.常用的使用宏的发送程序有:文件发送适配器和SMTP发送适 配器.在表达式中可以使用同时使用多个宏.例如:在文件发 ...
- 内省操作javabean的属性
import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector ...
- 自己用node.js 搭建APP服务器,然后用AFNetworking 请求 报如下错误:App TransportSecurity has blocked a cleartext HTTP (http://) resource load since it isinsecure. Temporary exceptions can be configured via your app's Info.
"App TransportSecurity has blocked a cleartext HTTP (http://) resource load since it isinsecure ...
- itertools 介绍
在python中itertool为python提供一系列迭代iterator的方法. 第一个:组合 排列 itertools.combinations(sq, r) 该函数的作用是在列表sq中穷举所有 ...
- 利用开源jPlayer播放.flv视频文件
最近工作中用到视频播放,在网上搜索对比了好几款开源播放插件后,觉得 jPlayer 是比较不错的,故作此记录! 接下来先快速的展示一下 利用jPlayer播放.flv视频的效果: <!DOCTY ...
- 统一的mvc异常处理
mvc异常处理 using System; using System.Configuration; using System.Web.Mvc; using Infrastructure.Excepti ...
- 关于scrollWidth,clientWidth,offsetWidth
scrollWidth:对象的实际内容的宽度,不包含边线(border)的宽度,会随对象的内容可视区后而变大. scrollHeight:对象的实际内容的高度,不包含边线(border)的宽度,会随对 ...