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

posted @ 2019-06-20 11:43  我是一个豆笔  阅读(231)  评论(0编辑  收藏  举报