当前位置: 首页 >  游戏攻略 >  代理模式之Java动态代理

代理模式之Java动态代理

2023-11-12 10:00:05 来源:8624软件园 作者:8624软件园

1. Overview

在包下,定义了自己的代理。利用这个包下的类,我们可以在运行时动态地创建一个代理类,实现一个或多个接口。并将方法的调用转发到你所指定的类。因为实际代理是在运行时创建的,所以称为:动态代理。

代理模式之Java动态代理

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