反射与代理设计模式
静态代理设计模式
- 我们先来看看传统的代理设计模式
- 如果按照设计要求来讲,必须是基于接口的设计,也就是说,要先定义一个核心的接口类。
package 阿里云大学java.java高级学习.反射练习;
class MessageReal implements IMessage{
@Override
public void send() {
System.out.println("【发送消息】阿鸡是笨蛋");
}
}
class MessageProxy implements IMessage {
private IMessage message;
public MessageProxy(MessageReal message){
this.message = message;
}
public boolean connect(){
System.out.println("【消息代理】进行消息发送通道的链接");
return true;
}
public void close(){
System.out.println("【消息代理】关闭消息通道");
}
@Override
public void send() {
if(this.connect()){
this.message.send();
this.close();
}
}
}
public class 反射与代理设计模式 {
public static void main(String[] args) {
IMessage message = new MessageProxy(new MessageReal());
message.send();
}
}
- 以后代码呢,就是我们传统的代理模式了,但是只要认真进行思考一番就会发现, 客户端的接口与具体的子类产生了耦合问题,所以这样的操作如果从实际开发来讲,我们最好引入工厂设计模式进行代理对象的获取;
- 以上的代理设计模式是静态的代理设计模式,这种模式有一个特点:一个代理类只为一个接口服务,那么如果现在有很多中接口,那么我们就要编写n个代理类,
- 现在就产生了一个问题:如何让一个代理类满足所有的业务接口需求,这个就是传统代理设计不具备的,所有我们只能使用动态代理设计来实现。
动态代理设计模式
- 在进行我们动态代理之中呢,我们首先该关注的就是invocationHandler接口,这个接口规定了我们的代理方法的执行。
- 在进行动态代理设计的时候对于动态对象的创建是由JVM底层完成的,此时主要依靠我们Java.lang.reflect.Proxy程序类,这个程序类里面有一个重要的程序方法:
- newProxyInstance(ClassLoader loader, Class<?>[] interfaces , InvocationHander h);
package 阿里云大学java.java高级学习.反射练习;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
class DTProxy implements InvocationHandler {
private Object target;
public Object bind(Object target){
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
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 {
System.out.println("【执行方法】:" + method);
Object returnData = null;
if(this.connect()){
returnData = method.invoke(this.target,args);
this.close();
}
return returnData;
}
}
class MessageReal implements IMessage{
@Override
public void send() {
System.out.println("【发送消息】阿鸡是傻逼");
}
}
class MessageProxy implements IMessage {
private IMessage message;
public MessageProxy(MessageReal message){
this.message = message;
}
public boolean connect(){
System.out.println("【消息代理】进行消息发送通道的链接");
return true;
}
public void close(){
System.out.println("【消息代理】关闭消息通道");
}
@Override
public void send() {
if(this.connect()){
this.message.send();
this.close();
}
}
}
public class 反射与代理设计模式 {
public static void main(String[] args) {
IMessage message = (IMessage) new DTProxy().bind(new MessageReal());
message.send();
}
}
- 说实话,我看了很久,还不是特别的理解这些,害,慢慢来,会理解的,加油
CGLIB实现代理设计模式
- 从java官方来讲已经明确的要求了如果要实现代理设计模式,那么一定是基于接口的应用,所以在我们官方给出Proxy类创建代理对象时,都需要传递所有的接口信息;
- 这玩意还要导入第三方工具包,害,头痛呀