使用静态代理,那么真实角色必须是事先存在的,并将其作为代理对象的内部属性,
在实际使用中,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀,
如果事先并不知道真实角色,那么就需要使用动态代理来解决
动态代理步骤
1.创建一个实现接口InvocationHandler的类,它不许实现invoke方法
2.创建被代理的类以及接口
3.通过proxy的静态方法newProxyInstance创建一个代理
4.通过代理调用方法
案例:
package DynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;
import java.util.Vector;
*
该代理类的内部属性是object类型;实际使用的时候通过该类的构造方法传递进来一个对象
*此外,该类还实现invoke方法,该方法的method、invoke其实是调用被代理对象将要执行的方法,
*方法参数是sub,表示该方法从属于sub,通过动态代理类,我们可以在执行真实对象的方法的前后
*加入自己的一些额外的方法
* @author Administrator
*
public class VectorProxy implements InvocationHandler{
//obj要被代理的类引用
private Object obj;
public VectorProxy(Object obj){
this.obj = obj;
}
////proxy代理实例本身,一般用不上;method:要调用的方法所对应的对象;args调用方法所传递的参数;invoke这个方法中的参数是java底层传递的
@Override
public Object invoke(Object proxy, Method method,
Object[] args)
throws
Throwable {
// TODO Auto-generated method
stub
if(args!=null){
for(Object obj :args){
System.out.println(obj);
}
}
//obj;要被代理的那个类对象,方法参数
Object object =
method.invoke(obj, args);
return object;
}
//该方法返回一个代理;newProxyInstance方法会在程序运行期间创建一个代理类;创建InvocationHandler实例;该类实现需要被代理那个类所实现的所有接口
public static Object
factory(Object obj){
return
Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(), new VectorProxy(obj));
}
public static void main(String[] args) {
//返回代理,因为该需要代理的类是vector,而vector所实现的接口是List;所以可以使用多态就是List来接收这个代理
List list = (List) factory(new
Vector());
//当调用add方法的时候;实际上是调用invoke方法
list.add("你好吗");
list.add("我很好");
System.out.println(list);
}
}