JDK动态代理是java.lang.reflect.*包提供的方式,它必须借助一个接口才能产生代理对象

代理模式过程:客户(调用者)想要开发一款软件,首先找到软件公司的业务代表(代理对象),代表公司对需求进行谈判,确定哪些需求能做,哪些不能做(代理逻辑处理),最终将能做的需求交给开发者(真实对象),开发者再对需求进行设计开发(真实对象的方法)
public interface helloWorld { ????public void sayHello(); }
public class helloWorldImpl implements helloWorld { ????@Override ????public void sayHello() { ????????System.out.println("Hello World"); ????} }
代理类包含两个步骤:
- 建立代理对象与真实对象之间的关系
- 实现代理逻辑方法
? ? ? 代理类需要实现java.lang.reflect.InvocationHandler接口里的invoke方法,并在invoke方法里编写处理逻辑
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;
public class jdkExample implements InvocationHandler { ????// 真实对象 ????private Object target =null; ????/** ?????* 建立代理对象与真实对象的代理关系 ?????* @ param targetObject真实对象 ?????* @ return 代理对象 ?????*/ ?public Object bind(Object targetObject){ ????this.target=targetObject;//保存真实对象 ????return?Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),this);
//返回代理对象,this表示当前对象 ????}
????/** ?????*代理方法逻辑处理 ?????* @param proxy 代理对象 ?????* @param method 当前调度方法 ?????* @param args 当前方法参数 ?????* @return 返回代理结果 ?????* @throws Throwable 异常 ?????*/ ????@Override ????public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { ????????System.out.println("进入代理逻辑方法"); ????????System.out.println("在调度真实对象之前的服务"); ????????Object obj = method.invoke(target, args); ????????System.out.println("在调度真实对象之后的服务"); ????????return obj; ????} }
public class testJdkProxy { ???public static void main(String[] args){ ??????jdkExample jdkExample = new jdkExample(); ??????helloWorld proxy = (helloWorld)jdkExample.bind(new helloWorldImpl());//绑定代理对象与真实对象的关系 ??????proxy.sayHello();//通过代理对象调用真是对象的方法 ????} }

?
|