java代理

java的代理有静态代理和动态代理两种,动态代理是使用了java的反射机制进行动态的生产代理对象。

接口

package com.llh.proxy;

public interface IHello {
    public void sayHollo();
}



实现类

package com.llh.proxy;

public class HelloImp implements IHello {

    @Override
    public void sayHollo() {
        System.out.println("hello!");
    }

}


静态代理

代理对象和本代理对象实现同一个接口

public class HelloProxy implements IHello{
    IHello proxy;

    public HelloProxy(IHello hello) {
        this.proxy = hello;
    }

    @Override
    public void sayHollo() {
        System.out.println("调用前...");
        proxy.sayHollo();
        System.out.println("调用后...");
    }

    public static void main(String[] args) {
        //被代理对象
        IHello hello = new HelloImp();

        //代理对象
        HelloProxy proxy = new HelloProxy(hello);

        //调用代理对象方法
        proxy.sayHollo();

        //输出结果
        //调用前...
        //hello!
        //调用后...
    }
}


动态代理

使用java的标准的动态代理可以动态创建我们需要的代理对象,无需自己实现创建和被代理对象同一个接口(IHello)的代理类,使用动态代理可以动态生成我们需要的代理对象,这个比静态代理更加灵活。

package com.llh.proxy;

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

/**
 * 动态代理测试
 * @author victor
 */
public class ProxyTest {

    public static void main(String[] args) {

        //需要被代理的对象
        IHello hello = new HelloImp();

        //代理处理
        InvocationHandler helloProxy = new InvocationHandler() {

            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //TODO 逻辑处理,如日志
                System.out.println("调用方法前....");

                //调用被代理的对象方法
                Object obj = method.invoke(hello, args);

                //TODO 逻辑处理,如日志
                System.out.println("调用方法后....");

                return obj;
            }
        };

        //返回代理对象
        IHello proxy = (IHello) Proxy.newProxyInstance(ProxyTest.class.getClassLoader(),new Class<?>[]{IHello.class},helloProxy);

        //调用代理方法
        proxy.sayHollo();

        //打印结果

        //调用方法前....
        //hello!
        //调用方法后....
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值