动态代理好处
优点简介
实现无侵入式的代码扩展;在不用修改业务代码的情况下,增加一些公共扩展;增加代码的可扩展性和灵活性;
废话不多 直接上代码。
代码演示
接口与其实现
package proxy.service;
/**
* 被代理对象接口
* @author admin
*
*/
public interface UserService {
void eat();
void speak();
}
package proxy.service.impl;
import proxy.service.UserService;
public class UserServiceImpl implements UserService {
@Override
public void eat() {
System.out.println("吃饭中。。。");
}
@Override
public void speak() {
System.out.println("说话中。。。");
}
}
切面类(扩展类)
package proxy.service;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 切面类 合并代理类
* @author admin
*
*/
public class MyRepect implements InvocationHandler{
private UserService us ;
public MyRepect(UserService us) {
super();
this.us = us;
}
public void before() {
System.out.println("前置方法");
}
public void after() {
System.out.println("后置方法");
}
//获取代理类 之所以要类类加载器参数 是 代理类 动态生成的 并没有class文件
public Object getUserService() {
return Proxy.newProxyInstance(us.getClass().getClassLoader(), us.getClass().getInterfaces(), this);
}
//交织 业务类 和 切面类
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object ret = method.invoke(us, args);
after();
return ret;
}
}
测试类
package proxy.test;
import proxy.service.MyRepect;
import proxy.service.UserService;
import proxy.service.impl.UserServiceImpl;
public class MainTest {
public static void main(String[] args) {
//获取被代理对象
UserService us = new UserServiceImpl();
MyRepect myRepect = new MyRepect(us);
UserService userService = (UserService) myRepect.getUserService();
userService.eat();
}
}
运行结果:
总结
- 使用 java.lang.reflect.Proxy 需要代理对象有接口 不能直接代理实现类;
- 动态代理 代理类是在代码运行是生成的 没有对应的class文件;
- 它实现了 设计模式 的 装饰者模式
最后如果大家有什么疑问需要讨论 可以给我留言 (`・ω・´)