码迷,mamicode.com
首页 > 其他好文 > 详细

jdk动态代理

时间:2014-09-13 13:19:05      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   使用   java   ar   

动态代理应用

1.权限拦截判断;

2.对象功能(方法)增强。

代理的意义:

1.代理对象存在的价值:主要用于拦截对真实业务对象的访问。

2.代理一个接口下的所有方法;

 格式: Proxy.newProxyInstance(类加载器,被代理对象所实现的接口,代理什么);

用该方法生成代理对象时,需要三个参数:

1.生成代理对象使用哪个类装载器

2.生成哪个对象的代理对象,通过接口指定:该对象所属类一定要实现一个接口;

代理谁:某个具体对象或object,代理后你可以找其他对象做这个事!!!

3.生成的代理对象的方法里干什么事,由开发人员编写handler接口的实现来指定。

 

代理类:

bubuko.com,布布扣
 1 package com.mzj.practice.test;
 2 
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5 import java.lang.reflect.Proxy;
 6 
 7 import org.slf4j.Logger;
 8 import org.slf4j.LoggerFactory;
 9 
10 public class XProxy {
11     private final Logger LOG = LoggerFactory.getLogger(this.getClass());
12 
13     private Object target;  // 目标对象  
14       
15     /** 
16      * 构造方法 
17      * @param target 目标对象  
18      */  
19     public XProxy(Object target) {  
20         super();  
21         this.target = target;  
22     }  
23     
24 //    private MX chun = new MX();
25 //    
26 //    public Object getProxy() {
27 //        return Proxy.newProxyInstance(XProxy.class.getClassLoader(), chun.getClass()
28 //                .getInterfaces(), new InvocationHandler() {
29 //            @Override
30 //            public Object invoke(Object proxy, Method method, Object[] args)
31 //                    throws Throwable {
32 //                if (method.getName().equals("dance")) {
33 //                    System.out.println("交钱...");
34 //                    return method.invoke(chun, args);
35 //                }
36 //                if (method.getName().equals("sing")) {
37 //                    System.out.println("交很多钱...");
38 //                    return method.invoke(chun, "十八摸");
39 //                }
40 //                return null;
41 //            }
42 //        });
43 //    }
44 
45     public Object getProxy() {
46         return Proxy.newProxyInstance(XProxy.class.getClassLoader(), target.getClass()
47                 .getInterfaces(), new InvocationHandler() {
48             @Override
49             public Object invoke(Object proxy, Method method, Object[] args)
50                     throws Throwable {
51                 if (method.getName().equals("dance")) {
52                     LOG.info(method.getName()+"调用前。。。");
53                     System.out.println("交钱...");
54                     LOG.info(method.getName()+"调用后。。。");
55                     return method.invoke(target, args);
56                 }
57                 if (method.getName().equals("sing")) {
58                     LOG.info(method.getName()+"调用前。。。");
59                     System.out.println("交很多钱...");
60                     LOG.info(method.getName()+"调用后。。。");
61                     return method.invoke(target, "十八摸");
62                 }
63                 return null;
64             }
65         });
66     }
67 
68     public static void main(String[] args) {
69         MX chun = new MX();//被代理的对象
70         XProxy proxy = new XProxy(chun);
71         Person mingxing = (Person) proxy.getProxy();// 一定是指向接口;
72         mingxing.dance("跳");
73         mingxing.sing("跳");
74 
75     }
76 }
View Code

 接口:

bubuko.com,布布扣
 1 package com.mzj.practice.test;
 2 /**
 3  * Copyright (C),HTF<br>
 4  * 通过代理者 能调用对象的哪些方法  都通过接口对外开放
 5  * 
 6  * @author muzhongjiang
 7  * @date 2014年9月13日
 8  */
 9 public interface Person {
10 
11     void dance(String string);
12 
13     void sing(String string);
14 
15 }
View Code

 被代理类:

bubuko.com,布布扣
 1 package com.mzj.practice.test;
 2 
 3 import org.slf4j.Logger;
 4 import org.slf4j.LoggerFactory;
 5 
 6 public class MX implements Person {
 7 
 8     private final Logger LOG = LoggerFactory.getLogger(this.getClass());
 9 
10     @Override
11     public void dance(String string) {
12         LOG.info("string=【" + string + "】");
13     }
14 
15     @Override
16     public void sing(String string) {
17         LOG.info("string=【" + string + "】");
18     }
19 
20     public void selfMeth(String string) {
21         LOG.info("string=【" + string + "】");
22     }
23 
24 }
View Code

 

jdk动态代理

标签:style   blog   http   color   io   os   使用   java   ar   

原文地址:http://www.cnblogs.com/muzhongjiang/p/3969670.html

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