动态代理
能解决什么问题?
可以在运行时修改类,这样可以用声明的方式来编程(对别的代码实现无侵入式编程)。
如:
- 给某些方法前后添加日志记录;
- 给某些方法添加事务支持;
- 给某些函数添加权限;
- 别人的代码,只有.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