1. Overview
在包下,定义了自己的代理。利用这个包下的类,我们可以在运行时动态地创建一个代理类,实现一个或多个接口。并将方法的调用转发到你所指定的类。因为实际代理是在运行时创建的,所以称为:动态代理。
Proxy:完全由java产生的,而且实现了完整的subject接口。
InvocationHandler:Proxy上的任何方法调用都会被传入此类,InvocationHandler控制对RealSubject的访问。
因为Java已经帮助我们创建了Proxy类,我们需要有办法告诉Proxy类你要做什么,我们不能像以前一样把代码写入到Proxy类中,因为Proxy类不是我们实现的。那么我们应该放在哪里?放在InvocationHandler类中,InvocationHandler类是响应代理的任何调用。我们可以吧InvocationHandler想成是代理收到方法调用后,请求做实际工作的对象。
Java代码
public Object invokeObject proxy, Method method, Object args
当代理的方法被调用的时候,代理就会把这个调用转发给InvocationHandler,也就会调用它的invoke方法。
提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类,我们经常使用的静态方式是:
Java代码
newProxyInstanceClassLoader loader, Class interfaces, InvocationHandler h
4. 示例:
4.1 定义一个接口:
Java代码
public interface Person
String getName;
String getGender;
void setNameString name;
void setGenderString gender;
void setRateint rate;
int getRate;
4.2 定义实现Person接口类
Java代码
public class PersonImpl implements Person
String name;
String gender;
String interests;
int rate;
public String getName
return name;
public void setNameString name
= name;
public String getGender
return gender;
public void setGenderString gender
= gender;
public String getInterests
return interests;
public void setInterestsString interests
= interests;
public int getRate
return rate;
public void setRateint rate
= rate;
nextpage
4.3 定义OwnerInvocationHandler类,表示如果为本人,则可以进行修改查看姓名性别。
Java代码
public class OwnerInvocationHandler implements InvocationHandler
private Person personBean;
public OwnerInvocationHandlerPerson personBean
= personBean;
@Override
public Object invokeObject proxy, Method method, Object args
"get"//如果方法名为get,就调用person类内的get相应方法
return , args;
else "setRate" // 如果方法是setRate,则抛出异常
throw new IllegalAccessException"access deny";
else "set" //如果为set,就调用person类内的set相应方法
return , args;
"non method invoke";
catch InvocationTargetException e
e.printStackTrace;
return null;
4.4 定义NonInvocationHandler类,表示如果不为本人,则可以进行查看姓名性别和修改rate。
Java代码
public class NonInvocationHandler implements InvocationHandler
private Person person;
public NonInvocationHandlerPerson person
= person;
@Override
public Object invokeObject proxy, Method method, Object args
throws Throwable
"setRate"
return , args;
else if "get"
return , args;
"non method invoke";
return null;
4.5 测试类MyDynamicProxy
Java代码
public class MyDynamicProxy
public Person getOwnerPersonBeanProxyPerson person
return ,
, new OwnerInvocationHandlerperson;
public Person getNonPersonBeanProxyPerson person
return ,
, new NonInvocationHandlerperson;
public static void mainString args
MyDynamicProxy mdp = new MyDynamicProxy;
public void test
Person person = getPersonBeanFromDB1;
Person personProxy = getOwnerPersonBeanProxyperson;
catch Exception e
"can not setRate";
Person person1 = getPersonBeanFromDB1;
Person personProxy2 = getNonPersonBeanProxyperson1;
private Person getPersonBeanFromDB1
Person pb = new PersonImpl;
"remy";
"girl";
return pb;
输出结果:
Java代码
remy can not setRate remy 2