🤵♂️ 个人主页:@香菜的个人主页,加 ischongxin ,备注csdn
✍🏻作者简介:csdn 认证博客专家,游戏开发领域优质创作者,华为云享专家,2021年度华为云年度十佳博主
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
1、代理机制
所谓的代理就是增加一个中间人,控制目标对象的访问。
代理机制一般用在AOP编程,在不改变原有类功能的情况下增加功能或者权限控制。
Java中常用的有两种动态代理方式,分别为:JDK动态代理和Cglib动态代理。
JDK动态代理是通过实现接口的方式完成动态代理。
Cglib动态代理是通过继承目标类或实现接口的方式完成动态代理。
2、JDK动态代理
JDK动态代理的原理就是在运行时动态生成class文件,基于反射调用方法,相当于系统帮你写代码了。
JDK动态代理主要涉及到两个接口:InvocationHandler和Proxy。
InvocationHandler是一个函数式接口,它定义了一个invoke方法,该方法被代理对象的所有方法调用所拦截,可以在这里添加额外的逻辑。
Proxy则是用于创建代理对象的类,它提供了一个静态方法newProxyInstance,该方法创建一个代理对象并返回。
public interface IHello {
String sayHello();
}
public class HelloImpl implements IHello{
@Override
public String sayHello() {
return "sayHello ";
}
}
public class ProxyHandler implements InvocationHandler {
private Object targetObject;//被代理的对象
//将被代理的对象传入获得它的类加载器和实现接口作为Proxy.newProxyInstance方法的参数。
public Object newProxyInstance(Object targetObject){
this.targetObject = targetObject;
//targetObject.getClass().getClassLoader():被代理对象的类加载器
//targetObject.getClass().getInterfaces():被代理对象的实现接口
//this 当前对象,该对象实现了InvocationHandler接口所以有invoke方法,通过invoke方法可以调用被代理对象的方法
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(),this);
}
//该方法在代理对象调用方法时调用
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("记录日志");
return method.invoke(targetObject,args);
}
}
public class Aain {
public static void main(String[] args) {
IHello hello = (IHello) new ProxyHandler().newProxyInstance(new HelloImpl());
hello.sayHello();
}
}
3、总结
代理对象在程序运行的过程中在内存构建
JDK动态代理实现目标对象所实现的接口,并生成代理类的字节码信息,通过类加载器进行加载,最后创建代理类对象,通过代理对象调用InvocationHandler接口实现类的invoke方法完成功能的增强。