动态代理概念
动态代理的意义
动态代理的意义:生成一个代理对象,来代理真实对象,控制真实对象的访问。
代理模式简单解析
如图所示:顾客通过前台点餐,而不直接向后厨点餐。前台代理后厨,能够完成出餐的需求。
- 这里 前台 是 代理 ,后厨 是 被代理。
- 后厨只需专注于出餐的需求,无需关注收钱等业务需求。
代理的作用
代理的作用:在真实对象访问之前或者之后加入对应的逻辑,或者根据其他规则控制是否使用真实对象。
实现JDK动态代理
## 接口与实现类
1. 接口
Person.java
package edu.mju.proxy;
public interface Person {
void run();
}
2. 实现类
Man.java
package edu.mju.proxy;
public class Man implements Person {
@Override
public void run() {
System.out.println("Man的run()方法");
}
}
## 代理逻辑类
JdkDynamicProxy.java
方法 | 说明 |
---|---|
Object proxyRelation(Object realObject) | 传入真实对象,建立代理对象和真实对象的代理关系,并返回代理对象 |
Object invoke(Object proxy, Method method, Object[] args) | 重写InvocationHandler接口中的invoke()方法.当我们使用了代理对象调度方法后,会进入invoke方法里面. |
package edu.mju.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* JDK动态代理
* 必须实现 InvocationHandler()接口
*/
public class JdkDynamicProxy implements InvocationHandler{
//真实对象
private Object realObject = null;
/**
* 建立代理对象和真实对象的代理关系
* @param realObject 真实对象
* @return 代理对象
*/
public Object proxyRelation(Object realObject) {
this.realObject = realObject;
//newProxyInstance(类加载器, 生成代理对象挂在该接口下, 实现方法逻辑的代理类);
return Proxy.newProxyInstance(realObject.getClass().getClassLoader(),
realObject.getClass().getInterfaces(),
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("---------------------进入代理invoke方法()---------------------");
System.out.println("-------------------------调用真实对象方法之前------------------------");
Object object = method.invoke(realObject, args);
System.out.println("------------------------调用真实对象方法之后------------------------");
return object;
}
}
测试类
package edu.mju.proxy;
public class TestJdkProxy {
public static void main(String[] args) {
//创建代理方法
JdkDynamicProxy jdkDynamicProxy = new JdkDynamicProxy();
//声明代理对象Person proxy,调用proxyRelation():建立代理对象和真实对象的代理关系
Person proxy = (Person)jdkDynamicProxy.proxyRelation(new Man());
proxy.run();
}
}
运行结果如下
---------------------进入代理invoke方法()---------------------
-------------------------调用真实对象方法之前------------------------
Man的run()方法
------------------------调用真实对象方法之后------------------------