IHello.java
package com.spring;
public interface IHello {
public void sayHello(String name);
public void sayGoodBye(String name);
}
Hello.java
package com.spring;
public class Hello implements IHello {
@Override
public void sayGoodBye(String name) {
// TODO Auto-generated method stub
System.out.println(name + " GoodBye");
}
@Override
public void sayHello(String name) {
// TODO Auto-generated method stub
System.out.println("Hello " + name);
}
}
Logger.java
package com.spring;
public class Logger {
public static void beforeDo() {
System.out.println("执行开始");
}
public static void afterDo() {
System.out.println("执行结束");
}
}
DynaProxyActor.java
package com.spring;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynaProxyActor implements InvocationHandler {
private Object delegate; //被代理的对象
public DynaProxyActor(Object delegate) {
this.delegate = delegate;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
Object result = null;
try {
Logger.beforeDo(); //执行原来的方法之前记录日志
// JVM通过这条语句执行原来的方法(反射机制)
result = method.invoke(this.delegate, args);
Logger.afterDo(); //执行原来的方法之后记录日志
} catch (Exception e) {
e.printStackTrace();
}
return result; // 返回方法返回值给调用者
}
}
TestAOP.java
package com.spring;
import java.lang.reflect.Proxy;
public class TestAOP {
public static void main(String[] args) {
// ①目标业务类
IHello target = new Hello();
// ② 将目标业务类和横切代码编织到一起
DynaProxyActor handle = new DynaProxyActor(target);
// ③ 创建代理类
IHello proxy = (IHello) Proxy.newProxyInstance(
target.getClass().getClassLoader(), //返回目标类的类装载器,保持两个类的类装载器一样
target.getClass().getInterfaces(), // 返回目标类实现的接口,保证组合而成的代理类也实现这些接口
handle // 指派谁去处理方法的对象
);
// ④ 操作代理实例
proxy.sayHello("Jack");
proxy.sayGoodBye("Rose");
}
}
class Vector {
int key;
int value;
}
Running Result:
执行开始
Hello Jack
执行结束
执行开始
Rose GoodBye
执行结束