首页 > 代码库 > jdk动态代理

jdk动态代理

动态代理应用

1.权限拦截判断;

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

代理的意义:

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

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

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

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

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

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

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

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

 

代理类:

 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 //            @Override30 //            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             @Override49             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

 接口:

 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

 被代理类:

 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     @Override11     public void dance(String string) {12         LOG.info("string=【" + string + "】");13     }14 15     @Override16     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动态代理