public interface Aspect {
void before();
void after();
static <T> T getProxy(Class<T> cls, String... aspects) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
List<Try<Aspect>> aspectInets = Stream.of(aspects)
.map(name -> Try.ofFailable(() -> {
Class clazz = Class.forName(name);
return (Aspect) clazz.getConstructor().newInstance();
}))
.filter(aspect -> aspect.isSuccess())
.collect(Collectors.toList());
T clazz = cls.getConstructor().newInstance();
return (T) Proxy.newProxyInstance(
// 类加载器
cls.getClassLoader(),
cls.getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
for (Try<Aspect> aspectTry : aspectInets) {
aspectTry.get().before();
}
Object result = method.invoke(clazz, args);
for (Try<Aspect> aspectTry : aspectInets) {
aspectTry.get().after();
}
return result;
}
});
}
}
public interface IOrder {
void pay(String number,String number2) throws InterruptedException;
void show();
}
public class Order implements IOrder {
int state = 0;
@Override
public void pay(String number,String number2) throws InterruptedException {
Thread.sleep(50);
this.state = 1;
System.out.println("输入参数 1"+number);
System.out.println("输入参数 1"+number2);
}
@Override
public void show() {
System.out.println("order status:" + this.state);
}
}
public class TEST {
@Test
public void testAop() throws InterruptedException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
IOrder order ;
order =Aspect.getProxy(Order.class, "AOP.proxy.TimeUsageAspect");
order.pay("1111","2222");
order.show();
}
}
public class TimeUsageAspect implements Aspect {
long start;
@Override
public void before() {
start = System.currentTimeMillis();
}
@Override
public void after() {
long usage = System.currentTimeMillis() - start;
System.out.format("time usage : %dms\n", usage);
}
}