这里直接贴出了代码,运行之后就知道动态代理是用来干什么的了。这里使用动态代理做了一个简单的AOP例子。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MainClass {
public static void main(String[] args) {
OnClickListenerImpl onClickListenerImpl = new OnClickListenerImpl();
AopHandler handler = new AopHandler(onClickListenerImpl);
handler.setBeforeListener((target, method, _args) -> System.out.println("前置增强"));
handler.setAfterListener((target, method, _args) -> System.out.println("后置增强"));
handler.setExceptionListener((target, method, _args) -> System.out.println("异常增强"));
OnClickListener listener = (OnClickListener) Proxy.newProxyInstance(
MainClass.class.getClassLoader(),
new Class[]{OnClickListener.class},
handler
);
listener.onClick();
}
private interface OnClickListener {
void onClick();
}
private static class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick() {
System.out.println("点击了");
}
}
private interface BeforeListener {
void before(Object target, Method method, Object[] args);
}
private interface AfterListener {
void after(Object target, Method method, Object[] args);
}
private interface ExceptionListener {
void exception(Object target, Method method, Object[] args);
}
private static class AopHandler implements InvocationHandler {
private BeforeListener beforeListener;
private AfterListener afterListener;
private ExceptionListener exceptionListener;
private Object target;
AopHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
if (null != beforeListener) {
beforeListener.before(target, method, args);
}
Object object = method.invoke(target, args);
if (null != afterListener) {
afterListener.after(target, method, args);
}
return object;
} catch (Exception e) {
if (null != exceptionListener) {
exceptionListener.exception(target, method, args);
}
return null;
}
}
void setBeforeListener(BeforeListener beforeListener) {
this.beforeListener = beforeListener;
}
void setAfterListener(AfterListener afterListener) {
this.afterListener = afterListener;
}
void setExceptionListener(ExceptionListener exceptionListener) {
this.exceptionListener = exceptionListener;
}
}
}