java基础-温故而知新
2020-12-13 15:48
标签:做了 怎么 with div 代理 from owa cli 现在 1.类和对象(实例)的关系 类就是对象的抽象(模板),对象就是类的实例 2.java设置模式--代理模式 定义:代理就是中介,例如租房子经常有中介,还有出票软件 飞猪,携程。 3.代理大纲分为两种:静态代理与动态代理,主要区别在于代理对象是自定义还是系统生成。自定义的为静态代理,自动生成的为动态代理 4.静态代理--举一个我们生活中买房子的事情中介事情 以上有我们生活中的行为类(接口),还有目标类(开发商的房子售卖的事情),中介,现在做一下用户测试 静态代理比较容易理解,简单理解就是,中介拿到了目标类的对象,然后在目标对象的前后做手脚 5.动态代理 --有JDK动态代理,CGLib动态代理等,我们就讲JDK动态代理---还是买房子这件事情 首先不变的有两个类--- 开发商目标类Developer,还有我们买房子这件事 SellHome 然后先跟大家隆重介绍两个新角色 ,不然都不敢说自己是动态代理了,不然怎么和静态代理区别呢 (1)InvocationHandler 这是一个处理器,主要就是每次要执行目标方法的时候,都会跑到InvocationHandler里面的invoke方法(到现在我都不知道底层是怎么实现的,不过我猜测可能是对目标类的各种方法做了listener监听) (2)Proxy类,刚刚我们说动态代理的代理对象是系统生成的,其实就是Proxy这个大佬生成的 有这两个角色,我们接着讲,我们还得创建一个实现InvocationHandler接口的实现类,创建的时候,把目标对象传给SellHandler,他就像会对目标对象盯得紧紧的 其次创建Client,我们来看一下 效果是一样的 动态代理肯定是比静态代理好,少写很多代码,统一处理 java基础-温故而知新 标签:做了 怎么 with div 代理 from owa cli 现在 原文地址:https://www.cnblogs.com/imfjj/p/11603135.htmlpackage jav.com.study.proxy.staticProxy;
//这是我们生活中买房子的事情中介事情
public interface SellHome {
public void sell();
}
package jav.com.study.proxy.staticProxy;
//这是目标类--房子开发商
public class Developer implements SellHome {
@Override
public void sell() {
System.out.println("这是开发商建造后需要销售的房子");
}
}
package jav.com.study.proxy.staticProxy;
//这是代理,即为中介
public class Medium implements SellHome{
SellHome sellHome;
Medium(SellHome sellHome){
this.sellHome=sellHome;
}
@Override
public void sell() {
System.out.println("买房子前咨询一下");
System.out.println("买房子前参观");
System.out.println("买房子签合同");
sellHome.sell();
System.out.println("买房子付款");
}
}
package jav.com.study.proxy.staticProxy;
public class Client {
public static void main(String[] args) {
//创建中介,传入target
SellHome sellHome=new Medium(new Developer());
sellHome.sell();
}
}
Connected to the target VM, address: ‘127.0.0.1:54952‘, transport: ‘socket‘
Disconnected from the target VM, address: ‘127.0.0.1:54952‘, transport: ‘socket‘
买房子前咨询一下
买房子前参观
买房子签合同
这是开发商建造后需要销售的房子
买房子付款
Process finished with exit code 0
package jav.com.study.proxy.dynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class SellHandler implements InvocationHandler {
Object target;
SellHandler(Object o){
this.target=o;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("买房子前咨询一下");
System.out.println("买房子前参观");
System.out.println("买房子签合同");
method.invoke(this.target,args);
System.out.println("买房子付款");
return null;
}
}
package jav.com.study.proxy.dynamicProxy;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
//第一步创建目标类
SellHome sellHome=new Developer();
//第二步创建控制类
SellHandler sellHandler=new SellHandler(sellHome);
//第三步创建代理对象
SellHome proxy= (SellHome) Proxy.newProxyInstance(sellHome.getClass().getClassLoader(),
sellHome.getClass().getInterfaces(),sellHandler);
//第四步骤代理类调用目标类方法
proxy.sell();
}
}
Connected to the target VM, address: ‘127.0.0.1:56137‘, transport: ‘socket‘
Disconnected from the target VM, address: ‘127.0.0.1:56137‘, transport: ‘socket‘
买房子前咨询一下
买房子前参观
买房子签合同
这是开发商建造后需要销售的房子
买房子付款
Process finished with exit code 0