动态代理技术在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元生代理