当前位置:首页 » JAVA技术教程

Java动态代理

2017-08-12 19:01 本站整理 浏览(1)

首先我们定义一个接口

public interface SayService 
{
    public void say();
}
View Code

接着实现这个接口

public class SayImpl implements SayService {

    @Override
    public void say() {
        System.out.println("I want to go shoping.");
    }

}
View Code

定义一个动态代理类了,每一个动态代理类都必须要实现 InvocationHandler 这个接口

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class DynamicProxy implements InvocationHandler {

    //我们要代理的真实对象
    private Object object;
    
    public  DynamicProxy(Object object) {
        this.object = object;
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        
        System.out.println("before go shoping");
        //当代理对象调用真实对象的方法时,其会自动跳转到代理对象关联的handler对象的invoke方法进行调用
        method.invoke(object, args);
        System.out.println("after go shoping");
        return null;
    }

}
View Code

定义测试方法

public class TestProxy {

    public static void main(String[] args) {
        
        //要代理的对象
        SayService sayImpl = new SayImpl();
        
        //要代理哪个对象,就要将改对象传进去,最后是通过其真实对象来调用方法的
        InvocationHandler handler = new DynamicProxy(sayImpl);
        
        //Proxy.newProxyInstance--创建代理对象
        //handler.getClass().getClassLoader()---加载代理对象
        //sayImpl.getClass().getInterfaces()--为代理对象提供的接口是真实对象所实现的接口,表示我们要代理的是改真实对象,这样我们就能调用接口中的方法
        //handler-关联上的InvocationHandler这个对象
        SayService sayService = (SayService)Proxy.newProxyInstance(handler.getClass().getClassLoader()
                ,sayImpl.getClass().getInterfaces(), handler);
        sayService.say();
        

    }

}
View Code

控制台打印的日志

before go shoping
I want to go shoping.
after go shoping