一、核心代码
* 使用静态方法生产一个代理对象(Proxy):
* public static Object newProxyInstance
* (ClassLoader loader,
* Class<?>[] interfaces,
* InvocationHandler h) {}
*
* 接口: InvocationHandler ,里面有一个 invoke()方法,当代理对象调用接口
* 里面的方法(spend())时会自动的调用invoke();
* 调用方法: public Object invoke(Object proxy,Method method,Object[]args)throws Throwable;
* 该方法是在 InvocationHandler 接口里面。
* 实现流程:
* 1、代理类需要实现 InvocationHandler接口
* 2、代理类需要有一个Object属性:private Object target;
* 3、代理对象需要通过Proxy.newProxyInstance()获得
* 4、最终客户端只需要传递真实业务类对象即可
*
二、完整代码
1、DynamicProxyMode.java
package reflect.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 使用静态方法生产一个代理对象(Proxy): public static Object newProxyInstance(ClassLoader loader,
* Class<?>[] interfaces,
* InvocationHandler h) {}
*
* 接口:InvocationHandler ,里面有一个 invoke()方法,当代理对象调用接口里面的方法(spend())时会自动的调
* 用invoke();
* 调用方法: public Object invoke(Object proxy,Method method,Object[]args)throws Throwable;
* 该方法是在 InvocationHandler接口里面。
* 结合反射实现的动态代理设计模式
* @ClassName: DynamicProxyMode
* @Author: Xlu
* @Date: 2020-06-15 9:48
* @Version 11
**/
public class DynamicProxyMode {
public static void main(String[] args) {
//通过
IMessage msg = (IMessage) new DynamicProxy().bind(new MessageReal());
//代理对象调用真实业务里的方法时,会去调用代理类里面的invoke()方法
msg.spend();
}
}
/**
* 动态代理类,实现了 InvocationHandler接口
* @Author Xlu
* @Date 2020-06-15 10:58
* @ClassName DynamicProxy
* @Version 11
**/
class DynamicProxy implements InvocationHandler {
private Object target;
public boolean connect() {
System.out.println("【动态代理】连接成功");
return true;
}
public void close() {
System.out.println("【动态代理】连接关闭");
}
/**
* 绑定真实业务与代理业务
* @Author Xlu
* @Date 11:08 2020-06-15
* @param target 真实业务对象
* @return java.lang.Object 代理业务对象
*/
public Object bind(Object target) {
this.target=target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
/**
* invoke 处理代理的类对象
* @Author Xlu
* @Date 11:01 2020-06-15
* @param proxy 需要代理的类
* @param method 其中的方法
* @param args 里面的参数
* @return java.lang.Object 真实业务返回的参数
*/
@Override
public Object invoke(Object proxy , Method method , Object[] args) throws Throwable {
System.out.println("执行方法");
Object returnObj = null;
if (this.connect()) {
returnObj=method.invoke(this.target , args);
this.close();
}
return returnObj;
}
}
2、IMessage.java
package reflect.proxy;
/**
* @ClassName: IMessage
* @Author: Xlu
* @Date: 2020-06-15 10:54
* @Version 11
**/
interface IMessage {
/**
* 静态代理接口方法
*
* @return void
* @Author Xlu
* @Date 9:26 2020-06-15
*/
public void spend();
}
3、MessageReal.java
package reflect.proxy;
/**
* 真实业务类
*
* @Author Xlu
* @Date 2020-06-15 9:27
* @ClassName StaticProxyReal
* @Version 11
**/
class MessageReal implements IMessage {
@Override
public void spend() {
System.out.println("【真实业务】");
}
}
三、运行结果
执行方法
【动态代理】连接成功
【真实业务】
【动态代理】连接关闭