• Java动态代理


    动态代理

    能解决什么问题?

    可以在运行时修改类,这样可以用声明的方式来编程(对别的代码实现无侵入式编程)。
    如:

    • 给某些方法前后添加日志记录;
    • 给某些方法添加事务支持;
    • 给某些函数添加权限;
    • 别人的代码,只有.class文件,但是需要添加额外的操作;

    声明的方式编程

    就是可以在xml文件或者什么地方声明下,即可实现对什么包或者以service结尾的的类的所有方法前后添加其他的操作。

    使用的实例

    • Spring 的AOP
    • 在Spring项目中用的注解,例如依赖注入的@Bean、@Autowired,事务注解@Transactional等都有用到

    实现示例

    我这就那开发者来举例吧

    提供模拟数据访问层接口

    一个开发者的接口

    /**
     * @since cl @ 2019-06-19 10:26
     * 开发者
     */
    public interface Developer {
    
        void code();
    
        void debug();
    }
    

    实现类

    实现一个java开发者的类

    /**
     * @since cl @ 2019-06-19 10:27
     * Java开发者
     */
    public class JavaDeveloper implements Developer{
    
        private String name;
    
        public JavaDeveloper(String name) {
            this.name = name;
        }
    
        public void code() {
            System.out.println(name+" doing code...");
        }
    
        public void debug() {
            System.out.println(name+" doing debug...");
        }
    }
    

    代理处理类:处理需要被代理的类该做啥

    /**
     * @since cl @ 2019-06-19 10:30
     */
    public class JavaDeveloperHandler implements InvocationHandler {
    
        Object object;
    
        public JavaDeveloperHandler(Object object) {
            this.object = object;
        }
    
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("听音乐....");
            method.invoke(object,args);
            System.out.println("打游戏....");
            return null;
        }
    
    }
    

    测试使用

    /**
     * @since cl @ 2019-06-19 14:31
     */
    public class DynamicProxyMain {
    
        public static void main(String[] args) {
            JavaDeveloper tomDeveloper = new JavaDeveloper("Tom");
            JavaDeveloperHandler handler = new JavaDeveloperHandler(tomDeveloper);
            Developer tomDeveloperProxy = (Developer)Proxy.newProxyInstance(tomDeveloper.getClass().getClassLoader(),
                    tomDeveloper.getClass().getInterfaces(),handler);
    
            tomDeveloperProxy.debug();
            tomDeveloperProxy.code();
        }
    }
    

    参考

    《码农翻身》-Java帝国之动态代理
    https://www.jianshu.com/p/95970b089360
    https://www.cnblogs.com/maybo/p/5193843.html

  • 相关阅读:
    继承
    构造函数,重载
    Java Scanner学习记录
    20131204-数据库基础
    20131128-正则表达式与委托
    20131125-序列化与正则表达式
    20131127-正则表达式
    20131120-接口字符串-小鸭子练习
    20131118-静态类抽象类-外部设备
    20131117-练习面向对象
  • 原文地址:https://www.cnblogs.com/wsygdb/p/11057817.html
Copyright © 2020-2023  润新知