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
随机推荐
- Ubuntu下VIM的安装及其配置——Linux篇
一.Ubuntu系统默认内置: 实际上ubuntu默认没有安装老版本的vi,只装了vim.vi是vim.tiny(vim的最小化版本,不含 GUI,并且仅含有一小部分功能,并且默认与vi兼容.此软件包 ...
- CSS权威指南 - 基本视觉格式化 4
改变元素显示 没有讨论与表格相关的.列表list-item的值.之后讨论. 改变显示角色 显示为块级元素 将一串链接(行内元素)改变垂直放置,若有如下一连串的链接: <div id=" ...
- 在 MVC4 中使用 Uploadify 3.2 - 1
Uploadify 是 JQuery 一个著名的上传插件,利用 Flash 技术,Uploadify 越过浏览器的限制,控制了整个上传的处理过程,实现了客户端无刷新的文件上传,这样就实现了在客户端的上 ...
- 使用 Git@OSC 管理代码
开源中国的 git 服务的地址是:http://git.oschina.net/ 以下记录 push 本地已有的项目至 git@osc 的过程. ① 注册登录之后,创建一个自己的项目: 创建好的默认项 ...
- 蓝牙—RFCOMM协议
RFCOMM是一个简单的协议,其中针对9针RS-232串口仿真附加了部分条款.可支持在两个蓝牙设备之间同时保持高达60路的通信连接.RFCOMM的目的是针对如何在两个不同设备上的应用之间保证一条完整的 ...
- 【C++】int、const char*、char*、char、string之间的转换
#include "stdafx.h" #include<string> #include<vector> #include<iostream> ...
- 当html标签不被识别时(不解析)不妨试试htmlspecialchars_decode();试试
- js-方法
最近觉得自己的基础貌似太薄弱了,找了几本电子书,整理了一下基础的 方法: Concat:返回一个新数组 var a=['a','b','c']; var b=['x','y','z']; var c= ...
- Linux的硬链接为何不能链接目录
Linux中的目录文件是特殊的文件,其中的数据是一个关联列表的,像c++中的map,或者Python中的dict,保存每个文件名(包括子目录,Linux中一切皆文件!)到iNode的映射.iNode本 ...
- 小Q系列之 最佳裁判
这个题需要注意一些数据条件 尤其是一些输入数据条件 #include<algorithm> #include<stdio.h> #include<math.h> u ...