反射之动态代理
今天重新学习反射。
package com.wu.动态代理;
public interface IMessage {
public void send();
}
package com.wu.动态代理;
public class MessageIml implements IMessage {
@Override
public void send() {
System.out.println("真正实现类,真正发发消息");
}
}
package com.wu.动态代理;
import java.lang.reflect.Method;
public interface InvocationHandler {
/**
* 代理操作这方法,可以提供统一代理支持
* @param proxy 代理对象
* @param method 要执行的目标类方法
* @param args 要执行方法所需的参数
* @return 返回结果
* @throws Throwable 执行所抛出的异常
*/
public Object invoke(Object proxy, Method method,Object[] args) throws Throwable;
}
Proxy.newProxyInstance
三个参数:
loader: 用哪个类加载器去加载代理对象
interfaces:动态代理类需要实现的接口
动态代理方法在执行时,会调用h里面的invoke方法去执行
package com.wu.动态代理;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyProxy implements InvocationHandler {
//真实目标代理类
private Object target;
/**
* 真实业务与代理业务之间的绑定处理
* @param target 真实业务对象
* @return 生成的代理业务对象
*/
public Object bind(Object target) throws Exception {
this.target=target;
// System.out.println("target.getClass().getInterfaces()=="+target.getClass().getInterfaces()[0]);
/**
* loader: 用哪个类加载器去加载代理对象
*
* interfaces:动态代理类需要实现的接口
*
* h:动态代理方法在执行时,会调用h里面的invoke方法去执行
*/
Object o = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this::invoke);
//真实开发这样用。 本质一样
// Object o = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new java.lang.reflect.InvocationHandler() {
// @Override
// public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// return null;
// }
// });
return o;
}
public boolean connect(){
System.out.println("通道连接");
return true;
}
public void close(){
System.out.println("通道关闭");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object returnData=null;
if (this.connect()){
returnData=method.invoke(this.target,args);
this.close();
}
return returnData;
}
}
package com.wu.动态代理;
public class DTest {
public static void main(String[] args) throws Exception {
IMessage message = (IMessage) new MyProxy().bind(new MessageIml());
message.send();
}
}
输出:
通道连接
真正实现类,真正发发消息
通道关闭