java之代理

最近看到这个词比较多,回顾了下java中的代理技术,他是jdk1,3之后增加的特性.

主要是一种思想.如果A具有某些行为在编译时无法确定,那么让B代替A在运行时执行.A的行为,因为此时A的行为是确定的.

代理是为了解决编译时无法确定具体实现的问题,利用代理可以在运行时创建一组实现了接口的新类,来对之前的实现进行修改操作.

这样有些抽象,下面是一个例子

首先定义一个接口,他封装了一个演员类会具有的一部分行为.

package com.tong.xu.proxy.dao;

public interface Actress {
    public String plan();
    public String foundChance();
    public String sigingContract();
}

然后一个演员肯定是具有这些行为的

package com.tong.xu.proxy.imp;

import com.tong.xu.proxy.dao.Actress;

public class Actor implements Actress {
    @Override
    public String plan() {
        return "安排计划";
    }

    @Override
    public String foundChance() {
        return "寻找机会";
    }

    @Override
    public String sigingContract() {
        return "签合同";
    }
}

 然而我们知道实际上演员会有代理人来替他们做一些事情.那么代理需要符合什么条件呢?他要能够根据需要代理的不同的事情来做出不同的行为以达到目的.

package com.tong.xu.proxy.imp;

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

public class Agent1 implements InvocationHandler {
    Actor actor = new Actor();
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        String result = null;
        String methodName = method.getName();
        if(methodName.equals("plan")){
            result = "替演员"+method.invoke(actor,args);
        }else if(methodName.equals("foundChance")){
            result = "帮助演员"+method.invoke(actor,args);
        }else{
            result = "安排演员"+method.invoke(actor,args);
        }
        return result;
    }
}

那么对演员来说,需要有人对他们需要做的事情进行分担,代理他们完成一些行为,所以他实际上是需要一个可以完成这部分行为的对象

  @Test
    public void testProxy(){
        Actress actress = (Actress) Proxy.newProxyInstance(this.getClass().getClassLoader(),new Class[]{Actress.class},new Agent1());
        System.out.println(actress.plan());
        System.out.println(actress.foundChance());
        System.out.println(actress.sigingContract());
    }

总结:

实现动态代理需要两点

1.代理类 实现InvocationHandler接口,并重写invoke方法:这里实际上是使用了反射来获取执行方法的属性

2,使用Proxy类方法newProxyInstance创建一个代理对象,这个方法有三个参数:类加载器,封装了要实现方法的类数组,实现了invocationHandler借口的代理类型对象

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值