* 动态代理
*
* @author Administrator
* 动态代理的主要意图就是解决审计问题,也就是横切面编程,在不改变我们已有代码结构的情况下增强或控制对象的行为。
* 动态代理实现代理的职责,业务逻辑Subject实现相关的逻辑功能,两者之间没有必然的相互耦合关系。
* 通知从另一个切面切入,最终在高层模块也就是Client进行耦合 完成逻辑封装任务。
* 要实现动态代理的首要条件就是:被代理者必须实现一个接口。
mport java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 抽象主题
interface Subject {
public void doSomething(String str);
}
// 真实主题
class RealSubject implements Subject {
@Override
public void doSomething(String str) {
System.out.println("do something!---->" + str);
}
}
/*********************************通知的实现************************************/
interface IAdvice{
public void exec();
}
class BeforeAdvice implements IAdvice{
@Override
public void exec() {
System.out.println("我是前置通知!");
}
}
/*********************************通知的实现************************************/
//动态代理的Handler类
class MyInvocationHandler implements InvocationHandler {
private Object target = null;
public MyInvocationHandler(Object _obj) {
this.target = _obj;
}
//接管所有方法的实现
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(this.target, args);
}
}
// 动态代理类
class DynamicProxy<T> {
public static <T> T newProxyInstance(Subject subject) {
ClassLoader loader=subject.getClass().getClassLoader();
Class<?>[] interfaces=subject.getClass().getInterfaces();
InvocationHandler handler=new MyInvocationHandler(subject);
//寻找JoinPoint连接点,AOP框架使用元数据定义
if (true) {
//执行一个前置通知
(new BeforeAdvice()).exec();
}
//重新生成一个对象
return (T) Proxy.newProxyInstance(loader, interfaces, handler);
}
}
public class Main {
public static void main(String[] args) {
// 定一个主题
Subject subject = new RealSubject();
// 定义主题代理,使用自己封装的动态代理者
Subject proxy = DynamicProxy.newProxyInstance(subject);
// 代理的行为
proxy.doSomething("finish!");
//使用原生的动态代理者
Subject proxy1=(Subject) Proxy.newProxyInstance(
subject.getClass().getClassLoader()
, subject.getClass().getInterfaces()
, new MyInvocationHandler(subject));
proxy1.doSomething("doSomething!");
}
}