JDK动态代理

public class Demo 
{
	@Test
	public void test1()
	{
		// 要被增强的对象
		final NormalPerson p=new NormalPerson();
		
		// 需求: 使用动态代理的方式对普通人进行增强
		// jdk提供的类和方法可以给咱们动态的生成代理对象/增强对象 不需要自己去创建增强类
		
		/*参数概述: 固定死的
		 *  参数1: 和要被增强的对象一样的类加载器
		 *  参数2: 和要被增强的对象一样的接口
		 *  					1 根据指定的传递接口 返回一个该接口下的实例
		 *  					2 传递的接口 里面的方法就是可以被增强的所有方法
		 *  
		 *  参数3: 所有的增强业务逻辑实现 (方法)
		 * */
		Person proxyPerson =(Person)Proxy.newProxyInstance(
				p.getClass().getClassLoader(), 
				p.getClass().getInterfaces(),
				new InvocationHandler() {
					
					/*参数概述 固定死的
					 * 参数1:不用管 永远是固定值    代理对象的类型 
					 * 参数2: 要被增强的方法
					 * 参数3: 要被增强的方法运行过程中需要的参数
					 * */
					
					@Override //invoke里面是所有的增强业务逻辑代码
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						
						
						if("eat".equals(method.getName()))
						{
								// 让以前的方法执行
								// 参数1:本身应该执行这个方法的对象
								// 参数2: 执行这个方法需要的参数
							 method.invoke(p, args);
							// 原来方法的返回值
							//System.out.println(value);
							// 写增强业务逻辑
							System.out.println("增强了:变成飞...");
							
							// 最终返回值 谁调用返回给谁
							return "abcd";
						}
						
							
						return method.invoke(p, args);
						
						
						
					}
				});
		
		//SupPerson sup=new SupPerson(p);
		//sup.run();
		proxyPerson.run(); // 执行这个方法  invoke都会执行一遍   执行的内容就是针对该方法的增强
		
		proxyPerson.run1(); // 执行这个方法  invoke都会执行一遍   执行的内容就是针对该方法的增强
		
		String value = proxyPerson.sleep();
		System.out.println(value);
		
		String value2 = proxyPerson.eat("榴莲");
		System.out.println(value2);
		
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值