`

Java 动态代理

    博客分类:
  • java
阅读更多

动态代理指为一个目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。使用代理对象,是为了在不修改目标对象的基础上,增强目标对象的业务逻辑。通过动态代理可以无侵入的为代码进行增强。

动态代理应用非常广泛,比如spring中的aop使用动态代理增加,动态代理主要有JDK和CGLIB两种。

JDK实现动态代理由两个重要部分组成,分别是Proxy、InvocationHandler。

Proxy是所有动态代理的父类,提供了静态方法来创建动态代理的class对象和实例。

InvocationHandler,每个动态代理实例都有一个关联的InvocationHandler,在代理实例上调用方法将被转发到invoke方法。

 

创建需要代理的目标接口和目标实现类

public interface SomeService {
    public void doSome();
    public void doOther();
}

public class SomeServiceImpl implements SomeService {
    @Override
    public void doSome() {
        System.out.println("执行业务方法doSome");
    }

    @Override
    public void doOther() {
        System.out.println("执行业务方法doOther");
    }
}

创建InvocationHandler接口的实现类(代理类)

public class MyInvocationHandler implements InvocationHandler {
    private Object targer;//目标对象
    public MyInvocationHandler (Object target) {
        this.target=target;
    }

    public Object invoke(Object proxy, Method method, Object[] args) {
        System.out.println("执行invoke方法");
        System.out.println("在这里做执行方法之前要做的事情");
        String methodName=method.getName();
        Objet res=method.invoke(target, args);
        System.out.println("在这里做执行方法之后要做的事情");
        return res;
    }
}

通过代理类调用目标方法

publicstaticvoid main(String[] args) {
    //目标对象
    SomeService target=new SomeServiceImpl();
    //代理对象
    InvocationHandler handler=new MyInvocationHandler(target);
    SomeService proxy=(SomeService)Proxy.newProxyInstance(target.getClass().getClassLoader(), 
                                                            target.getClass().getInterfaces(), 
                                                            handler);
    proxy.doSome();//执行第一个目标方法
    proxy.doOther();//执行第二个目标方法
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics