代理反射

代理

静态代理

核心点就是,代理对象要持有具体的被代理对象 ===》 确定性代理

例子:

/**
 * @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");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值