JDK的动态代理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK的动态代理相关的知识,希望对你有一定的参考价值。

代理的目的就是在你做事之前、之后、过程中。。。不改变你的行为(代码)加点其他东东

接口:

package com.liule.code;

public interface Bookinterface
{
    public void addBook();
}

委托类:

package com.liule.code;

public class Book implements Bookinterface
{
    @Override
    public void addBook()
    {
        System.out.println("add");
    }
}

代理类:

public class BookProxy implements InvocationHandler
{
    private Object target;//委托对象,也可以直接是Book
    
    public BookProxy(Object target)
    {
        this.target = target;
    }
    
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable
    {
        System.out.println("start");
        Object result = method.invoke(target,args);//实现委托类的method,参数args
        System.out.println("end");
        return result;
        
    }
}

测试:

public class test
{
    public static void main(String[] args)
    {
        Bookinterface boo = new Book();
        Bookinterface proxy = (Bookinterface) Proxy.newProxyInstance(boo.getClass().getClassLoader(),boo.getClass().getInterfaces(),new BookProxy(boo));
        proxy.addBook();
    }
}

 

InvocationHandler接口: 
public interface InvocationHandler { 
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; 

参数说明: 
Object proxy:指被代理的对象,一般不用
Method method:要调用的方法 
Object[] args:方法调用时所需要的参数

 

Proxy类: 
Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了如下的操作方法: 
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, 
InvocationHandler h) 
                               throws IllegalArgumentException 
参数说明: 
ClassLoader loader:类加载器 
Class<?>[] interfaces:得到全部的接口 
InvocationHandler h:得到InvocationHandler接口的子类实例

以上是关于JDK的动态代理的主要内容,如果未能解决你的问题,请参考以下文章

(java反射-JDK动态代理)+CGLIB动态代理

JDK动态代理CGLIB动态代理

JDK动态代理CGLIB动态代理

JDK动态代理与Cglib动态代理

JDK动态代理与CGLib动态代理

代理模式-3(手写实现JDK动态代理)