码迷,mamicode.com
首页 > 编程语言 > 详细

java--02--动态代理

时间:2018-01-03 00:41:06      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:接口   图片   code   use   载器   open   ==   dao   span   

技术分享图片
 1 动态代理,
 2     1)代理对象,不需要实现接口;
 3     2)代理对象的生成,是利用JDK API, 动态的在内存中构建代理对象(需要我们指定创建 代理对象/目标对象 实现的接口的类型;);
 4     3)  动态代理, JDK代理, 接口代理;
 5 
 6 JDK中生成代理对象的API:
 7 |-- Proxy
 8     static Object newProxyInstance(
 9 ClassLoader loader,       指定当前目标对象使用类加载器
10  Class<?>[] interfaces,     目标对象实现的接口的类型
11 InvocationHandler h       事件处理器
12 )  
13 
14 
15 动态代理总结:
16     代理对象不需要实现接口,但是目标对象一定要实现接口;否则不能用动态代理!
17     (class  $Proxy0  implements IuserDao)
18 
19 思考:
20     有一个目标对象,想要功能扩展,但目标对象没有实现接口,怎样功能扩展?
21     Class  UserDao{}
22     // 子类的方式
23     Class subclass  extends  UserDao{}
24     
25     以子类的方式实现(cglib代理)
View Code

接口, 要干的活

技术分享图片
1 public interface IUserDao {
2 
3     void save();
4     
5     void update();
6 }
View Code

目标对象必须实现接口

技术分享图片
 1 // 目标对象
 2 public class UserDao implements IUserDao{
 3 
 4     @Override
 5     public void save() {
 6         System.out.println("目标对象,插入数据到DB中...");
 7     }
 8 
 9     @Override
10     public void update() {
11         System.out.println("目标对象, 修改数据...");
12         
13     }
14 
15 }
View Code

代理对象不用实现接口

技术分享图片
 1 public class ProxyFactory {
 2     private Object target;
 3     public ProxyFactory(Object target){
 4         this.target = target;
 5     }
 6 
 7     public Object getProxyInstance(){
 8         
 9         return Proxy.newProxyInstance(
10                 target.getClass().getClassLoader(), 
11                 target.getClass().getInterfaces(),
12                 new InvocationHandler(){
13 
14                     @Override
15                     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
16                         System.out.println("开启事务");
17                         Object value = method.invoke(target, args);//== target....  args是方法的参数
18                         System.out.println("提交事务");
19                         return value;
20                     }
21                     
22                 }
23 
24             );
25     }
26 }
View Code

干吧...

技术分享图片
 1 public class ProxyTest {
 2 
 3     public static void main(String[] args) {
 4         //2.动态代理
 5         IUserDao target = new UserDao();
 6         IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
 7         proxy.save();
 8         proxy.update();
 9         /*
10          开启事务
11         目标对象,插入数据到DB中...
12         提交事务
13         
14         开启事务
15         目标对象, 修改数据...
16         提交事务
17          */
18     }
19 }
View Code

 

java--02--动态代理

标签:接口   图片   code   use   载器   open   ==   dao   span   

原文地址:https://www.cnblogs.com/bravolove/p/8179881.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!