前言
之前我们通过静态代理可以在编译期创建一个代理对象,如果要求我们必须在运行时创建一个代理,如时间代理,如何做了?
也就是说,需要写一个代理(proxy),然后我们只需要传入相关接口,它就可以主动生成代理对象
再一次使用之前的情景,即有一个打野对象接口和具体打野盲僧,然后编写一个针对打野的动态代理(proxy),只要传入(打野接口对象),就可以动态自动生成该java文件,并且载入内存并不jvm编译
下面就是其代码实现
Jungle(打野接口)
LeeSin(盲僧)
如果想要动态生成一个事件代理(按常理应该新建一个代理类),按照动态思想,我们将该创建该类的所以涉及的代码赋给一个字符串
上面字符串就是创建该代理的代码,然后如果jvm能自动将其编译成.class并且载入内存,就是一个真的类了,按照这种思想,我们可以通过jvm提供的方法完成
为了方便先把上述动态创建时间代理放在测试中(也就是main函数中)
1.首先将代码格式修整一下,即加个换行,同时将字符写入时间代理文件中
这里先一小段一小段的加,目前是已经在该包下生成一个LeeSinTimeProxy.java文件,并且里面有被写入的字符,但是纯粹只是一个文件,因为还没被编译和载入内存
2.进行编译
至此,在包下也动态生成了一个.class文件,而平常我们编译时都会在path路径下,jdk主动生成.class,而此时我们自己指定了位置
3.载入内存
4.利用反射取出实例
|
|
以下是结果:
class com.zwl.pr.LeeSinTimeProxy
LeeSin is ganking…
gank time:7557
gank time:7563
至此算是动态生成了时间代理,但是目前是很有局限性的,因为我们指定了一个特定接口,而不是泛指,当然通过这个例子,也算是初识了一把动态模式的魅力,当然它的最大魅力,在于制定任何接口,返回相应的代理类
在这里我们先将测试的类中代码移至Proxy类中
|
|
目前先不管错误,在做测试类
这里参数我们可以设置任何class接口,当然先不管错误,至少动态代理算是成功了。