0821 Mark老师 反射及动态代理模式:
泛型复习:
为什么需要泛型?
泛型方法辨识
限定类型变量
泛型类、接口、方法
泛型中的约束和局限性
泛型类型的继承规格
通配符类型
虚拟机是如何实现泛型的?
反射(Reflect):
反射是一开始并不知道我要初始化的类对象是什么,
自然也无法使用new关键字来创建对象了,这时候我们
就使用JDK提供的反射API进行反射调用。
【各种框架,比如Retrofit】
反射就是在运行时才知道操作的类是什么并且可以在运行时
获取类的完整构造,并调用对应的方法。
getMethods:获取子类所有公有方法和父类的所有方法
getDeclareMethod :获取当前类的所有方法(私有和公有方法)
Class: Field、Constructor、Method
我们写的每一个类都可以看成一个对象,是java.lang.Class类的对象。
代理模式那些事
定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用
目的:
(1)通过引入代理对象的方式来间接访问目标对象,防止直接
访问目标对象给系统带来的不必要复杂性
(2)通过代理对象对原有的业务增强
代理模式:中介
张三 <---> Mark代购 <---> A用品公司
抽象角色:
接口: 买东西
A用品公司接口: <<接口>>Subject 抽象对象
RealSubject: 真实对象
Proxy :Mark老师 代理对象
张三:访问者
代理模式:
静态代理违反了开闭原则,对修改关闭,对新增开放
静态代理:扩展能力差,可维护性差
张三、张三老婆、李四... ...
代码实现:略
开闭原则:新增的业务对原有的业务不改变
解决这样的问题,jdk就引入了动态代理的问题
动态代理那些事
Mark海外代购公司
张三 Mark海外代购公司 A用品公司
张三老婆 Mark海外代购公司 B用品公司
动态代理优点:运行的时候才会产生代理类和代理对象。
缺点:
运行效率比静态代理效率低,应用场景受限
Proxy:海外代购公司
InvocationHandler:客户口碑,优质的代购服务
代码实现:略
Proxy:拿到动态代理的对象
// 第一个参数:真实对象类加载器
// 第二个参数:真实对象类的接口
// 第三个参数: 实现接口
Proxy.new PeoxyInstance();
MarkCompany markCompany = new MarkCompany();
markCompany.setFactory(aafactory);
Aafactory ac = markCompany.getProxyInstance();
ac.setWomanTools(1.9f);
package com.xiaowei;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 动态代理
* <p>Title: MarkCompany</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2019</p>
* @author weip
* @date:2022年8月21日 上午11:12:43
* @version 1.0
* 注意:本内容仅限于内部传阅,禁止外泄以及用于其他的商业目
*/
public class MarkCompany implements InvocationHandler{
/** 持有的真实对象 **/
private Object factory;
public Object getFactory() {
return factory;
}
public void setFactory(Object factory) {
this.factory = factory;
}
/** 通过Proxy获取动态代理对象 **/
public Object getProxyInstance() {
return Proxy.newProxyInstance(
factory.getClass().getClassLoader(),
factory.getClass().getInterfaces(),
this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
doSthBefore();
// 动态代理,做了增强
Object result = method.invoke(factory, args);
doSthAfter();
return result;
}
/** 后置处理器 **/
private void doSthAfter() {
System.out.println("精品包装一条龙服务");
}
/** 前置处理器 **/
private void doSthBefore() {
System.out.println("考察市场,了解用户需求");
}
}