jdk动态代理和静态代理

代理:

	简单理解就可以理解为在一个java类上去给它增加一些新的功能,但是却不用动原来
	
的代码,就是让代理角色帮助真实角色完成一件事情;

静态代理:

	静态代理相当于是多写了一个代理类,在调用的时候调用的是代理类,在代理类中的
	
处理还是原生的处理逻辑,不过在前后添加上需要添加的代码。
			
缺点:需要为每一个被代理的对象都创建一个代理类。
public class StaticProxyDemo {
    public static void main(String[] args) {
        you you = new you();
        you.mary();
        System.out.println("----------");
        company company = new company(you);
        company.mary();

    }
}
interface Mary{
    void mary();
}
class you implements Mary{

    @Override
    public void mary() {
        System.out.println("每个人都要结婚");
    }
}
//婚庆公司代理角色
class company implements Mary{
    private Mary mary;

    public company(Mary mary) {
        this.mary = mary;
    }

    @Override
    public void mary() {
        //代理角色帮助真实角色完成结婚这件事情
        System.out.println("婚庆公司结婚之前帮忙布置婚礼");
        mary.mary();
        System.out.println("婚庆公司结婚之后收取尾款");
    }
}

jdk动态代理:

通过下面这个方法创建动态的代理类,我们只需将别的类去调用我们实现的公共方法,就可以。
缺点:必须要实现接口。

public static Object newProxyInstance(ClassLoader loader,   
		参数1:实现的接口的类加载器
 Class<?>[] interfaces,    
		参数2:基于接口的字节码文件对象数组
InvocationHandler h)        
		参数3:是接口InvocationHandler :代理的处理程序
throws IllegalArgumentException

参数3是一个接口:自定义一个类实现这个接口
重写这个接口中的invoke方法
Object invoke(Object proxy,Method method,Object[] args)throws Throwable

版本1

接口
public interface User {
    //加
    void add();
    //减
    void sub();
    //乘
    void mu();
    //除
    void divide();
	}
}
实现类1
public class UserDemo01 implements  User{
    @Override
    public void add() {
        System.out.println("加法功能");
    }

    @Override
    public void sub() {
        System.out.println("减法功能");
    }

    @Override
    public void mu() {
        System.out.println("乘法功能");
    }

    @Override
    public void divide() {
        System.out.println("除法功能");
    }
}
测试类
public class JdkProxyDemo {
    public static void main(String[] args) {
        User user = new UserDemo01();
        user.add();
        user.sub();
        user.mu();
        user.divide();
   }
}

结果:

	加法功能
	减法功能
	乘法功能
	除法功能

版本2(改进后)

实现类2
public class UserDemo02 implements User {
    @Override
    public void add() {
        System.out.println("权限校验") ;

        System.out.println("执行加法功能");

        System.out.println("产生日志文件");
    }

    @Override
    public void sub() {
        System.out.println("权限校验") ;

        System.out.println("执行减法功能");

        System.out.println("产生日志文件");
    }

    @Override
    public void mu() {
        System.out.println("权限校验") ;

        System.out.println("执行乘法功能");

        System.out.println("产生日志文件");
    }

    @Override
    public void divide() {
        System.out.println("权限校验") ;

        System.out.println("执行除法功能");

        System.out.println("产生日志文件");
    }
}
测试类2
public class JdkProxyDemo {
    public static void main(String[] args) {
        User user2 = new UserDemo02();
        user2.add();
        user2.sub();
        user2.mu();
        user2.divide();
    }
}

结果:

	权限校验
	执行加法功能
	产生日志文件
	权限校验
	执行减法功能
	产生日志文件
	权限校验
	执行乘法功能
	产生日志文件
	权限校验
	执行除法功能
	产生日志文件

版本3(加上jdk动态代理)

invocation的实现类
public class MyInvocation implements InvocationHandler {
    private Object obj;

    public MyInvocation(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("校验权限");
        Object object = method.invoke(obj, args);
        System.out.println("产生日志文件");
        return object;
    }
}
测试类3
public class JdkProxyDemo {
    public static void main(String[] args) {
        MyInvocation myInvocation = new MyInvocation(user);
        User user1=(User) Proxy.newProxyInstance(
                user.getClass().getClassLoader(),
                user.getClass().getInterfaces(),
                myInvocation
        );
        user1.add();
        user1.sub();
        user1.mu();
        user1.divide();
    }
}

结果:

	校验权限
	加法功能
	产生日志文件
	校验权限
	减法功能
	产生日志文件
	校验权限
	乘法功能
	产生日志文件
	校验权限
	除法功能
	产生日志文件
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值