JDK动态代理实现
动态代理 Dynamic Proxy
-
动态代理就是需要生成一个代理对象(又称为占位),通过这个代理对象来代替真正的对象,从而控制其他对于真实逻辑的访问。
- 主要的作用就是在真实对象被访问之前或者之后加上对于的处理逻辑或者根据实际的需求来觉得是否可以使用真实对象达到一个控制的目的。
- 比如去一间饭馆吃饭,我们点菜是对于前台的接待或者服务员点的,最后需要服务员或前台将自己点好的菜单教到厨师的手中之后我们才可以对菜品进行品尝,而这也可以表达动态代理的基本原理。
JDK动态代理 JDK Dynamic Proxy
JDK动态代理是java.lang.reflect.*包提供的一种方式,不需要额外的第三方jar包。
JDK动态代理实现的方式需要借助接口来实现,也就是说对于需要代理的真实对象:
- 首先需要创建该对象的接口
- 然后再创建该类并且实现这个接口,
- 最后定义代理逻辑类,这个代理逻辑类就需要实现java.lang.reflect.InvocationHandler接口,在这个代理逻辑类中我们首先建立代理对象和真实对象的代理关系,其次就需要在invoke方法中下挂自己的代理对象。
通过一个实际小例子展示
- 首先定义真实对象的接口
/**
* JDK动态代理真实对象的自定义接口
* @author WW
*/
public interface JdkProxy {
public void method();
}
- 其次创建对象的类并实现该接口
/**
* JDK动态代理 自定义接口的实现类
* @author WW
*/
public class JdkProxyImpl implements JdkProxy{
@Override
public void method() {
System.err.println("jdk proxy test demo !");
}
}
- 编写代理逻辑类
该类需要建立代理对象和真实对象的关系和在invoke方法下挂代理对象。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* JDK动态代理的 代理逻辑实现类
* @author WW
*/
public class JdkProxyService implements InvocationHandler{
//真实对象
private Object trueObj = null;
/**
* 建立代理对象和真实对象的代理关系
* @param trueObj 真实对象
* @return 代理对象
*/
public Object bind(Object trueObj) {
this.trueObj = trueObj;
//newProxyInstance三个参数
//第一个参数 类加载器
//第二个参数 生成的动态代理对象下挂的接口
//第三个对象 实现方法逻辑的代理类 此处就是这个类本身
return Proxy.newProxyInstance(
trueObj.getClass().getClassLoader(),
trueObj.getClass().getInterfaces(),
this);
}
/**
* 代理逻辑
* @param proxy 代理对象
* @param method 当前调用的方法
* @param args 当前调用的方法所需参数
* @return
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.err.println("代理方法开始被调用......");
System.err.println("使用真实对象之间的处理逻辑......");
//相当于调用method方法 只有这里使用了真实对象 并且使用真实对象之前是可以有其他逻辑处理的
Object object = method.invoke(trueObj, args);
System.err.println("在使用真实对象之后的处理逻辑......");
return object;
}
}
- 编写测试类
package com.ww.test;
import com.ww.jdkproxy.JdkProxy;
import com.ww.jdkproxy.JdkProxyImpl;
import com.ww.jdkproxy.JdkProxyService;
/**
* 测试类部分
* @author WW
*/
public class Test {
public static void main(String[] args) {
JdkProxyService jdkProxyService = new JdkProxyService();
//首先需要绑定关系 注意这里的对象类型 是JdkProxy接口 而不是该接口的实现类
JdkProxy proxy = (JdkProxy) jdkProxyService.bind(new JdkProxyImpl());
//此时的proxy已经是一个代理对象 因为bind方法返回的就是一个代理对象
//通过代理对象调用方法
proxy.method();
}
}
- 测试结果
完成!JDK动态代理!^ _ ^