Heim  >  Artikel  >  Datenbank  >  用JDK DyProxy 模拟 AOP 实现

用JDK DyProxy 模拟 AOP 实现

WBOY
WBOYOriginal
2016-06-07 16:32:521099Durchsuche

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();
        }
    }
}
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn