代理

简介
Proxy代理模式是一种结构型设计模式,作用是避免对象直接被访问

java中代理技术主要用于扩展功能又修改源代码

静态代理

代理类和委托类都实现同一个接口,静态代理中在编译的时候就确定了

代理类和接口实现类的区别

委托类的方法必须和代理类的方法一致,调用代理类就像调用委托类一样

静态代理的缺点

一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率变低。动态代理可以很好解决

动态代理

依靠反射实现,在运行时才能动态创建成
动态代理涉及两个类java.lang.reflect.proxyjava.lang.reflect.invocationHandler,前者是创建动态代理类,后者是处理实例,并返回结果

package com.example.webdemo01.demo;
interface Rent {
    public void rent();
}

package com.example.webdemo01.demo;

public class Host implements Rent{

    @Override
    public void rent() {
        System.out.println("出租房子");
    }
}

package com.example.webdemo01.demo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyInvocationHandler implements InvocationHandler {
    private Object obj;

    public void setObj(Object obj) {
        this.obj = obj;
    }

    public Object getproxy(){
        //创建代理类,会在代理类代理的方法里加super.invoke
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("aaa");

        Object invoke = method.invoke(obj, args);
        System.out.println("bbb");
        return invoke;
    }
}
package com.example.webdemo01.demo;

import com.example.webdemo01.Service.UserServiceImpl;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class DemoApplicationTests {


    @Test
     public void method(){
        Host host = new Host();
        ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler();
        proxyInvocationHandler.setObj(host);

        Rent getproxy = (Rent)proxyInvocationHandler.getproxy();

        getproxy.rent();
    }
}



CGLIB动态代理

用JDK动态代理必须有一个接口类,使用CGLIB动态代理不需要接口类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值