JDK动态代理--Demo

来源:互联网 发布:淘宝卖家退款要验证码 编辑:程序博客网 时间:2024/05/22 05:22

Java代理有JDK动态代理、CGLIB代理,这里只说下JDK动态代理,JDK动态代理主要使用的是JAVA反射机制(既java.lang.reflect包)

原理是(歌手、经纪人做例子):

      建立一个公共的接口,比如:歌手public interface Singer;

      用具体的类实现接口,比如:周杰伦,他是歌手所以实现Singer这个类,class MySinger  implements Singer

      建立代理类,这里也就是经纪人,他需要实现InvocationHandler类,并重写invoke方法

这样当有什么事情,要找周杰伦(具体类)的时候,就必须先到经纪人(代理类)那里处理,代理人在决定要不要与你见面(该方法要不要执行)。


代码:

1、歌手接口

package proxy;public interface Singer {public abstract void sing();}

2、具体的歌手

package proxy;public class MySinger implements Singer {@Overridepublic void sing() {System.out.println("I' m Jay Chou, and I'm singing Simple Love.");}}

3、代理类(经纪人)

package proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class Agent implements InvocationHandler {private Singer singer;public Agent(Singer singer) {this.singer = singer;}public Agent() {}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {String methodName = method.getName();Object obj = null;if ("sing".equals(methodName)) {System.out.println("事务开始");System.out.println("权限认证");// obj =method.invoke(singer, args);System.out.println("事务结束");}return obj;}}

4、测试(为什么要间接口能,下面你会发现代理返回的是他们的接口类,这要一个代理类,就可以代理多个类,只要该类是同个一个接口的是实现)

package proxy;import java.lang.reflect.Proxy;public class Test {public static void main(String[] args) {Agent agent = new Agent(new MySinger());Singer singer = (Singer) Proxy.newProxyInstance(Singer.class.getClassLoader(), new Class[] { Singer.class },agent);singer.sing();}}

0 0
原创粉丝点击