java--02--动态代理

Posted 黑土白云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java--02--动态代理相关的知识,希望对你有一定的参考价值。

技术分享图片
 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--动态代理的主要内容,如果未能解决你的问题,请参考以下文章

JAVA之AOP

动态 Rstudio 代码片段

是否可以动态编译和执行 C# 代码片段?

支持动态或静态片段的不同屏幕尺寸?

Forge Viewer - 如何在场景中访问(或获取渲染/片段代理)克隆的网格?

在ansible模板中使用动态组名称