ZerikRay

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

动态代理学习

1.InvocationHandler

官方文档:

proxy:

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h);
  • loader:一个classloader对象,定义了由哪个classloader对象对生成的代理类进行加载

  • interfaces:一个interface对象数组,表示我们将要给我们的代理对象提供一组什么样的接口,如果我们提供了这样一个接口对象数组,那么也就是声明了代理类实现了这些接口,代理类就可以调用接口中声明的所有方法。

  • h:一个InvocationHandler对象,表示的是当动态代理对象调用方法的时候会关联到哪一个 InvocationHandler对象上,并最终由其调用

 

InvocationHandler

  // proxy:代理类代理的真实代理对象
  // method:我们所要调用某个对象真实的方法的Method对象   
  // args:指代代理对象方法传递的参数
public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;

 

 

 InvocationHandler实现

public class ProxyInvocationHandler implements InvocationHandler {
​
    //代理类中的真实对象
    private Object target;
​
    public void setTarget(Object target) {
        this.target = target;
    }
​
    /**
     * 创建代理
     *
     * @return
     */
    public Object getProxy() {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),                                                      target.getClass().getInterfaces(), this);
    }

  @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Before(method.getName());
        Object result = method.invoke(target, args);
        return result;
    }
​
    private void Before(String msg) {
        System.out.println("这是一个:" + msg + "方法");
    }
}

 

service:

public interface Service {
​
    void add();
​
    void delete();
​
    void update();
​
    void query();
}

 

serviceImpl

public class ServiceImpl implements Service {
    @Override
    public void add() {
        System.out.println("新增一个操作");
    }
​
    @Override
    public void delete() {
        System.out.println("删除一个操作");
    }
​
    @Override
    public void update() {
        System.out.println("修改一个操作");
    }
​
    @Override
    public void query() {
        System.out.println("查询一个操作");
    }
}

 

  

 

测试类:

public class Test {
​
​
    public static void main(String[] args) {
        ServiceImpl service = new ServiceImpl();
        ProxyInvocationHandler pih = new ProxyInvocationHandler();
        pih.setTarget(service);
        Service proxy = (Service) pih.getProxy();
        proxy.add();
    }
}

 

输出结果:

这是一个:add方法
新增一个操作

 


 

 

posted on 2020-08-26 15:52  雨田君  阅读(12)  评论(0)    收藏  举报