JDK的动态代理

JDK的动态代理
目的:在不修改源码的基础上,对已有方法增强

代理的方式
JDK的动态代理是基于接口的动态代理:
要求:被代理对象最少实现一个接口。
提供者:JDK官方
涉及的类:Proxy
涉及的方法: newProxyInstance():用于创建代理对象
方法的参数:
ClassLoader:类加载器,和被代理对象使用相同的类加载器。一般都是固定写法。
Class[]:实现的接口。和被代理对象实现相同的接口。一般固定写法
InvocationHandler: 如何代理。(想怎么增强方法,都写在这。)
它是一个接口,我们需要提供该接口的匿名内部类

JDK动态代理案例
被代理类Actor
要求必须实现一个接口

public class Actor implements IActor {
    @Override
    public void movie(String name) {
        System.out.println("战狼三");
    }

    @Override
    public void teleplay(String name) {
        System.out.println("权利的游戏");
    }
}

被代理类实现的接口IActor

public interface IActor {
    void movie(String name);

    void teleplay(String name);
}

使用JDK的动态代理对Actor类中方法增强

public class Demo {
	@Test
	public void demo(){
	    // 1 被代理对象
		final IActor actor = new Actor();
		
    	// 2 创建代理对象 使用方法Proxy.newProxyInstance(被代理类的类加载器,被代理类的类实现的接    口,InvocationHandler匿名实现类实现方法增强)
		IActor actorProxy = (IActor) Proxy.newProxyInstance(actor.getClass().getClassLoader(), actor.getClass().getInterfaces(), new InvocationHandler() {
			@Override
			public Object invoke(Object proxy, Method method, Object[] args)
					throws Throwable {
					// 3  invoke(代理类,被增强方法,被增强方法的参数)
				Object invoke = null;
				if (method.getName().equals("teleplay")) {
				// 4 增强方法1
					System.out.println("插播广告:"+args[0]+",就是这么自信");
					//	5 执行被增强方法method.invoke(被代理类, 方法参数);
					invoke = method.invoke(actor, args);
				}
				
				if (method.getName().equals("movie")) {
					System.out.println("插播广告:"+args[0]+",好酒");
					invoke = method.invoke(actor, args);
				}
				return invoke;
			}
		});
		
		// 6代理饿类执行方法
		actorProxy.movie("茅台");
		actorProxy.teleplay("飘柔");
	}
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值