JDK动态代理
概念:
动态代理的意义在于生成一个代理对象,来代理真实对象,从而控制真实对象的访问。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。步骤:
1.代理对象与真实对象之间建立代理关系。
2.实现代理对象的代理逻辑方法。
条件:
1.JDK动态代理必须借助接口才能产生代理对象(要有接口)
2.JDK动态代理是通过java.lang.reflect.*包实现的(代理类要用到该包)
实现:

1 package com.karat.cn.design.proxy.jdk; 2 3 public interface Hello { 4 5 void say(); 6 }接口

1 package com.karat.cn.design.proxy.jdk; 2 3 public class HelloImpl implements Hello{ 4 5 @Override 6 public void say() { 7 // TODO Auto-generated method stub 8 System.out.println("晚安世界"); 9 } 10 11 }接口实现
第一步建立代理对象与真实对象的关系 :
1.用this保存真实对象(也可以抽出来放在代理类的构造方法中)
2.newProxyInstance方法中参数:
第1个:是类加载器
第2个:是确认将生成的代理对象下挂哪一个接口
第3个:是定义实现方法的逻辑代理类,this表示当前类,
它必须实现InvocationHandler接口的invoke方法,也就是下面的代理类逻辑实现方法
第二步实现代理逻辑方法:
1.invoke方法中参数:
第1个:代理对象
第2个:当前调度的方法
第3个:调度方法的参数
1 package com.karat.cn.design.proxy.jdk; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 import java.lang.reflect.Proxy; 6 7 public class JdkProxyExample implements InvocationHandler{ 8 //真实对象 9 private Object target=null; 10 11 /** 12 * 建立代理对象与真实对象之间的代理关系 13 * @param target 真实对象 14 * @return 代理对象 15 */ 16 public Object bind(Object target) { 17 this.target=target; 18 //生成代理对象 19 return Proxy.newProxyInstance(target.getClass().getClassLoader(), 20 target.getClass().getInterfaces(), this); 21 } 22 /** 23 * 代理方法逻辑 24 * arg0:代理对象(bind返回的对象) 25 * arg1:当前调度方法 26 * arg2:调度方法的参数 27 */ 28 @Override 29 public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable { 30 // TODO Auto-generated method stub 31 System.out.println("进入代理"); 32 System.out.println("在调度真实对象之前操作"); 33 Object object=arg1.invoke(target, arg2); 34 System.out.println("在调度真实对象之后操作"); 35 return object; 36 } 37 38 }

1 package com.karat.cn.design.proxy.jdk; 2 3 public class TestJdkProxy { 4 5 public static void main(String args[]) { 6 JdkProxyExample example=new JdkProxyExample(); 7 Hello hello=(Hello)example.bind(new HelloImpl()); 8 hello.say(); 9 } 10 }测试

更多精彩