代理
静态代理
核心点就是,代理对象要持有具体的被代理对象 ===》 确定性代理
例子:
/**
* @Author: JZJ
* @Date: 2020/6/19 14:58
*/
public class StaticProxy implements HelloWorld {
private HelloWorld service;//被代理对象 -- 代理了HelloWorld“一类”;HelloWorld可能有多种实现类
public StaticProxy(HelloWorld service) {//构造的时候确定具体的被代理对象
this.service = service;
}
@Override
public void sayHelloWorld() {
System.out.println("我是代理,我要帮被代理人打点打点。。。");
service.sayHelloWorld();
System.out.println("我是代理,我要帮被代理人做做收尾工作。。。");
}
public static void main(String[] args) {
HelloWorld helloWorld = new StaticProxy(new HelloService());
helloWorld.sayHelloWorld();//StaticProxy代替HelloService执行sayHelloWorld()并夹带了自己的私货
}
}
动态代理》JDK
核心点:
1、java.lang.reflect.Proxy#newProxyInstance
2、重写java.lang.reflect.InvocationHandler的invoke方法来实现代理逻辑
例子:
public static void main(String[] args) {
List<String> list = new ArrayList<>();
List<String> instance = (List<String>) Proxy.newProxyInstance(list.getClass().getClassLoader()
, list.getClass().getInterfaces()
, (proxy, method, args1) -> method.invoke(list, args1));
instance.add("1");
instance.add("2");
instance.add("3");
System.out.println(instance);
}
结果:
[1, 2, 3]
动态代理》CGLib
核心点:
1、org.springframework.cglib.proxy.Enhancer#create(java.lang.Class, java.lang.Class[], org.springframework.cglib.proxy.Callback)
2、重写org.springframework.cglib.proxy.MethodInterceptor#intercept
public static void main(String[] args) {
List<String> list = new ArrayList<>();
List<String> instance = (List<String>) Enhancer.create(list.getClass()
, list.getClass().getInterfaces()
, (MethodInterceptor) (o, method, objects, methodProxy) -> methodProxy.invoke(list, objects));
instance.add("1");
instance.add("2");
instance.add("3");
System.out.println(instance);
}
静态代理和动态代理的区别:
静态代理需要指定被代理的类;动态代理是可以代理任意类,运行时才知道代理什么类。
反射
通过反射获取java中反射类的字节码(Class);通过Class可以获取类相关信息(Method、Filed、Constructor等)
获取CLass的方式:1、Class.forName();2、Class.class;3、obj.getClass()
Class<User> userClass = User.class;
User user = new User("","");
Class<? extends User> userClass1 = user.getClass();
Class<?> aClass = Class.forName("JDK_8.User");