java动态代理

java的动态代理,是要基于接口实现的。

定义一个接口Dongwu

/**
* <p>@ClassName: Dongwu</p>
* <p>Description: 动物接口</p>
*/
public interface Dongwu {

    //定义动物两个方法
    public void chi();
    public void jiao();
}

定义Dog类实现Dongwu接口

public class Dog implements Dongwu {

    @Override
    public void chi() {
        System.out.println("狗在吃骨头。。。。。。");

    }
    @Override
    public void jiao() {
        System.out.println("狗在旺旺的叫。。。。。");

    }
}

定义一个代理处理器。该处理其是关键,可以控制代理对象实现,自己给代理对象调用方法过程中的业务逻辑。

public class ProxyHandler implements InvocationHandler {
    private Object object;
    
    public ProxyHandler(Object object){
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("方法调用之前。。。。。");
        if("jiao".equals(method.getName())){
            System.out.println("代理狗在旺旺的叫。。。。。。。");
        }else{
            method.invoke(object, args);
        }
        System.out.println("方法调用之后。。。。。");
        return null;
    }

}

最后测试动态代理过程:

/**
* <p>@ClassName: ProxyTest01</p>
* <p>Description: java动态代理测试</p>
*/
public class ProxyTest01 {
    @Test
    public void test1(){
        /*
         * 在java中对象new出来后,他的属性方法,就已经固定:
         * public void chi() {
            System.out.println("狗在吃骨头。。。。。。");}
           public void jiao() {
            System.out.println("狗在旺旺的叫。。。。。");}
         * */
        Dog dog = new Dog();
        //如果此时在某次方法的调用中改变dog中jiao()的输出语句,可以使用dog的代理对象,即代理狗
        ProxyHandler h = new ProxyHandler(dog);
        //生产出代理狗proxydog
        Dongwu proxydog = (Dongwu) Proxy.newProxyInstance(dog.getClass().getClassLoader(), dog.getClass().getInterfaces(), h);
        proxydog.chi();
        proxydog.jiao();
    }

}

 输出结果:

你可能感兴趣的:(java动态代理)