• JDK的动态代理,一文搞定


    动态代理的话分为jdk的动态代理和cglib动态代理,jdk的动态代理是基于接口实现的,意思就是,要代理的类必须实现某个接口作为代理模型,而cglib则是直接基于类进行动态代理,今天主要讲jdk的动态代理,后边再对cglib进行拓展(好多同学不明白动态代理的目的,其实就是在不修改源代码的前提下对方法进行拓展,如果我可以保存方法的操作日志,或者打印方法的执行时间等等

    1.首先要了解jdk动态代理最重要的一个api,Proxy类下的

    1. public static Object newProxyInstance(ClassLoader loader,
    2. Class[] interfaces,
    3. InvocationHandler h)
    4. throws IllegalArgumentException{
    5. ……
    6. }

    对每个参数进行简单的讲解,第一个就是使用哪个类加载器对代理类进行加载, 第二个参数就是指定代理的接口,就是说以哪个接口为模型就带代理拓展,也就是说代理的类有哪些方法,第三个参数就是指定具体的代理类执行的拓展方法逻辑

    2.创建要代理的接口模型,意思就是根据接口中定义的方法进行代理

    1. //接口1
    2. public interface Animal {
    3. void wakeup();
    4. void sleep();
    5. }
    6. //实现类1
    7. public class Cat implements Animal {
    8. private String name;
    9. public Cat() {
    10. }
    11. public Cat(String name) {
    12. this.name = name;
    13. }
    14. @Override
    15. public void wakeup() {
    16. System.out.println("小猫"+name+"早晨醒来啦");
    17. }
    18. @Override
    19. public void sleep() {
    20. System.out.println("小猫"+name+"晚上睡觉啦");
    21. }
    22. }
    23. //实现类2
    24. public class Dog implements Animal {
    25. private String name;
    26. public Dog() {
    27. }
    28. public Dog(String name) {
    29. this.name = name;
    30. }
    31. @Override
    32. public void wakeup() {
    33. System.out.println("小狗"+name+"早晨醒来啦");
    34. }
    35. @Override
    36. public void sleep() {
    37. System.out.println("小狗"+name+"晚上睡觉啦");
    38. }
    39. }

    3.创建代理类,就是定义具体的方法拓展

    1. //代理类
    2. public class JDKDynamicProxy implements InvocationHandler {
    3. private Object bean;
    4. public JDKDynamicProxy(Object bean) {
    5. this.bean=bean;
    6. }
    7. @Override
    8. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    9. String methodname=method.getName();
    10. if (methodname.equals("wakeup")){
    11. System.out.println("早安~~~");
    12. }else if(methodname.equals("sleep")){
    13. System.out.println("晚安~~~");
    14. }
    15. return method.invoke(bean,args);
    16. }
    17. }

    4.编写测试类

    1. //测试类
    2. public class TestJDKDynamicProxy {
    3. public static void main(String[] args) {
    4. JDKDynamicProxy proxy = new JDKDynamicProxy(new Student("张三"));
    5. //创建代理实例
    6. Person student = (Person) Proxy.newProxyInstance(proxy.getClass().getClassLoader(), new Class[]{Person.class}, proxy);
    7. student.wakeup();
    8. student.sleep();
    9. proxy = new JDKDynamicProxy(new Doctor("王教授"));
    10. Person doctor = (Person) Proxy.newProxyInstance(proxy.getClass().getClassLoader(), new Class[]{Person.class}, proxy);
    11. doctor.wakeup();
    12. doctor.sleep();
    13. }
    14. }

  • 相关阅读:
    sde Geodatabase tool to upgrade system tables
    mysql5.7源码安装
    SpringBoot图片验证码
    Django 模版转义
    上架用的SDK三方应用隐私
    常用的设计模式
    Linux内存地址映射-8086分段分页与缺页异常
    docker部署clickhouse-server
    C语言之指针数组、结构体、动态内存分配
    【JAVA设计模式】适配器模式
  • 原文地址:https://blog.csdn.net/weixin_59244784/article/details/132795727