package test;import java.lang.reflect.*;/** * Created with IntelliJ IDEA. * User: e513480 * Date: 12/3/13 * Time: 4:39 PM * To change this template use File | Settings | File Templates. */interface SomeInterface { public String someMethod(
package test;
import java.lang.reflect.*;
/**
* Created with IntelliJ IDEA.
* User: e513480
* Date: 12/3/13
* Time: 4:39 PM
* To change this template use File | Settings | File Templates.
*/
interface SomeInterface {
public String someMethod(String val);
}
class SomeBean implements SomeInterface {
@Override
public String someMethod(String val) {
System.out.println("some method invoked, val=" + val);
if ("throw1".equalsIgnoreCase(val)) {
throw new IllegalArgumentException("This is a Exception");
} else if ("throw2".equalsIgnoreCase(val)) {
throw new IllegalStateException("This is a Exception");
}
return val;
}
}
class InvocationHandlerAdapter implements InvocationHandler {
private Object proxyedObject;
private Advice advice;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object ret = null;
try {
advice.doBeforeInvoke(proxyedObject, method, args);
ret = method.invoke(proxyedObject, args);
advice.doAfterSuccessInvoke(proxyedObject, method, args);
} catch (InvocationTargetException e) {
advice.doAfterThrows(proxyedObject, method, args, e.getCause());
} finally {
advice.doAfterInvoke(proxyedObject, method, args);
}
return ret;
}
public Object getProxyedObject() {
return proxyedObject;
}
public void setProxyedObject(Object proxyedObject) {
this.proxyedObject = proxyedObject;
}
public Advice getAdvice() {
return advice;
}
public void setAdvice(Advice advice) {
this.advice = advice;
}
}
interface Advice {
void doBeforeInvoke(Object proxyedObject, Method method, Object[] args);
void doAfterSuccessInvoke(Object proxyedObject, Method method, Object[] args);
void doAfterInvoke(Object proxyedObject, Method method, Object[] args);
void doAfterThrows(Object proxyedObject, Method method, Object[] args, Throwable e) throws Throwable;
}
public class ProxyTest {
private static T createProxy(String beanName, Advice advice) {
T proxy = null;
try {
InvocationHandlerAdapter handler = new InvocationHandlerAdapter();
handler.setAdvice(advice);
Class toBeProxedClass = Class.forName(beanName);
handler.setProxyedObject(toBeProxedClass.newInstance());
proxy = (T) Proxy.newProxyInstance(toBeProxedClass.getClassLoader(), toBeProxedClass.getInterfaces(), handler);
} catch (Exception e) {
throw new IllegalArgumentException("Failed to create proxy.", e);
}
return proxy;
}
public static void main(String[] args) {
try {
String beanName = "test.SomeBean";
Advice advice = new Advice() {
@Override
public void doBeforeInvoke(Object proxyedObject, Method method, Object[] args) {
System.out.println("doBeforeInvoke");
}
@Override
public void doAfterSuccessInvoke(Object proxyedObject, Method method, Object[] args) {
System.out.println("doAfterSuccessInvoke");
}
@Override
public void doAfterInvoke(Object proxyedObject, Method method, Object[] args) {
System.out.println("doAfterInvoke");
}
@Override
public void doAfterThrows(Object proxyedObject, Method method, Object[] args, Throwable e) throws Throwable {
System.out.println("doAfterThrows, the exception is " + e);
if (e instanceof IllegalStateException) {
//throw2
throw e;
}
}
};
SomeInterface proxy = createProxy(beanName, advice);
System.out.println("------------begin---------------------");
String val = proxy.someMethod("hello");
System.out.println("returned val=" + val);
System.out.println("------------end---------------------");
System.out.println("------------begin---------------------");
val = proxy.someMethod("throw1");
System.out.println("returned val=" + val);
System.out.println("------------end---------------------");
System.out.println("------------begin---------------------");
try {
val = proxy.someMethod("throw2");
System.out.println("should not get to here");
} catch (IllegalStateException e) {
System.out.println("should get to here");
}
System.out.println("returned val=" + val);
System.out.println("------------end---------------------");
} catch (Exception e) {
e.printStackTrace();
}
}
}原文地址:用JDK DyProxy 模拟 AOP 实现, 感谢原作者分享。
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号