Java动态代理

本文详细介绍了Java动态代理技术,包括其在Spring框架AOP中的应用及HDFS中的使用。通过实例展示了如何利用JDK原生动态代理和CGLIB实现动态代理,包括接口定义、实现类创建、InvocationHandler接口实现等关键步骤。
摘要由CSDN通过智能技术生成

动态代理技术在java中用到很广泛,spring 框架中Aop 使用到动态代理,大数据hdfs 也用到代理对象 , 如果对动态代理不熟悉spring 框架是学不明白
jdk原生动态代理是基于接口实现的 CFLIB 动态代理使用继承方式实现的 这也是 spring aop框架中使用到的两大类动态代理
下面是代码

先定义一个接口
package com.test;

//定一个人类的接口
public interface Person {
	//人说话的方法
  public void sayHello(String str);
}

实现这个接口的类
package com.test;

public class PersonImp  implements Person {

	@Override
	public void sayHello(String str) {
		System.out.println("jdk动态代理:" + str);
	}

}


定义一个类实现InvocationHandler接口 
package com.test;

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

//代理类实现InvocationHandler
public class ProxyPerson implements  InvocationHandler {

	private  Person  target;
	public ProxyPerson(Person person) {
		this.target=person;
	}
	//代理类调用的方法最后都会走invoke方法中   基于 java 反射机制  
	/**
	 * @param  proxy  代理对象
	 * @param  method 代理方法
	 * @param  args   方法参数
	 * 
	 * */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		//这个地方可以加业务逻辑
		System.out.println("执行之前");
	    Object  obj=method.invoke(target, args);
		System.out.println("执行之后");
		return obj;
	}

}

//定义一个Test
第一种写法
Person Imp=new PersonImp();Person proxy=(Person) Proxy.newProxyInstance(Main.class.getClassLoader(),   Imp.getClass().getInterfaces(),new ProxyPerson(Imp));
	proxy.sayHello("test");
第二种写法
Person Imp=new PersonImp();
	Person proxy=(Person) Proxy.newProxyInstance(Main.class.getClassLoader(), Imp.getClass().getInterfaces(),new InvocationHandler() {
		@Override
		public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		//这个地方可以加业务逻辑
			Imp.sayHello(args[0].toString());
			return null;
		}
	});

	```
	有没有发现  第二种写法InvocationHandler这个接口居然可以new??  我们学习java基础 的时候就知道了接口不可用使用关键字new的  为什么这里可以呢 ?我们后面博客再出答案
	以上就是jdk元生代理 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值