Proxy代理简单使用

Proxy代理简单使用

使用Proxy实现织入额外代码

1.需要先定义接口和被代理类:

public interface UserBean {
    String getUser();
    String printStr(String name);
}

2.实现类

public class UserBeanImpl implements UserBean {
    private String user = null;
    public UserBeanImpl(){
    }
    public UserBeanImpl(String user) {
        this.user = user;
    }
    @Override
    public String getUser() {
        System.out.println("this is getUser() method!");
        return user;
    }
    public void setUser(String user) {
        this.user = user;
    }
    @Override
    public String printStr(String name) {
        System.out.println(name);
        return name;
    }
}

3.定义代理类UserBeanProxy,实现InvocationHandler接口的invoke方法,进行代码织入

public class UserBeanProxy implements InvocationHandler {
    /**
     * 被代理对象
     */
    private Object target;
    public UserBeanProxy() {
    }
    public UserBeanProxy(Object target) {
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //织入代码前置
        System.out.println("invoke proxy before biz");
        Object a = method.invoke(target, args);
        //织入代码后置
        System.out.println("invoke proxy after biz");
        return a;
    }
}

4.测试

public class TestBeanProxy {

    public static void main(String[] args) {
    	//被代理对象	
        UserBeanImpl target = new UserBeanImple("ABC");
		//代理对象
		UserBeanProxy proxy = new UserBeanProxy(target);

		//创建代理对象实例
		Object instance = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), proxy);
		//这里只能强转为接口
        String printStr = ((UserBean)instance).printStr("testArgs");
        System.out.println("printStr====" + printStr);
    }
}

RPC调用,只是引用了另外一个中心的服务api就能够调用另外一台机器的服务,就是使用了代理来实现底层的网络通信。下面的例子使用了泛型。clz是一个接口类newProxyInstance 的参数 使用了 new Class[]{clz}。如果是具体的实现类,可以使用clz.getInterfaces()来代替。如果入参是一个实例,可以通过target.getClass().getInterface()来处理。

public static <T> T getRpcProxyBean(Class<T> clz){
        return (T) Proxy.newProxyInstance(clz.getClassLoader(), new Class[]{clz}, new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                System.out.println("实现网络请求逻辑");

                return null;
            }
        });
    }
    
UserFacade userFacade = RpcProxy.getRpcProxyBean(UserFacade.class);

如果需要走一个对象里面的原逻辑,需要先实例化一个对象object(sourceBean)。

public static void main(String[] args) {
        TestProxy sourceBean = new TestProxyImpl();
        Object testProxy = createProxy2(sourceBean);
        String bbb = ((TestProxy)testProxy).printString("bbb");
        System.out.println(bbb);
    }
    public static Object createProxy2(Object object){
        Object instance = Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("aaa1");
                Object ccc = method.invoke(object,args);
                System.out.println("aaa2");
                return "ccc";
            }
        });
        return instance;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值