在讲动态代理模式之前,我们首先要弄明白什么是代理
代理,这个概念在生活中似乎很常见
通常代理都有两个作用,一个是方便你去使用它代理的东西
当一个类被创建的时候,虽然我们可以直接使用它
但是在不同的场合,可能在使用它之前,还需要对它进行一些额外的处理
比如说,WOW在中国这个场合使用的时候,就需要对它进行一些额外的处理……
但是,不管再怎么处理,它本质上还是WOW
除了那些图标和各种贴图被和谐了之外,在游戏内容上还是完全没变的
所以,代理的作用就是:
根据不同的情况,往原先的功能上添加一些额外的功能
但是这些额外的功能的添加,并不会影响到原有功能的使用
如果你通过代理类来使用这些功能的话,就会在使用原有功能的同时,执行这些额外的功能
*注:可能这个例子不是太贴切,并且实际上代理还有很多种其他的理解和含义
但是在此我们仅注重它的结论,以及在编程时的作用就好了
现在,我们的重点就出来了,那就是代理类应该怎么写
而“代理类”,既然叫“类”,那么它就应该是为一个“类”进行代理的
为了方便下面的讲解,我们暂且管被代理的这个类叫做“原有类”好了
然后,根据上面给出的代理的作用,我们可以看出,一个好的代理类,应当符合以下两个条件
1、能够往原有类的功能上添加一些额外的功能
2、不影响原有类中功能的使用
为了方便讲解,我们还是先了解一下匿名内部类和反射的知识吧:
首先,匿名内部类是什么呢?
说白了,匿名内部类就是当你需要一个类的时候,[color=Red]现定义现使用的一个类[/color]
举个例子吧,假设现在有一个方法叫execute,这个方法要求传入一个Runnbale类型的参数
也就是说,这个方法被定义成execute(Runnable runnable);这样
这样,如果你想要调用execute这个方法,就必须要往里面传入一个Runnable类型的对象
而众所周知,Runnable这是一个接口,而接口是不能直接创建对象的
所以,如果你想要调用这个方法的话,你还必须要先创建一个Runnable接口的实现类
这样,你在调用execute方法的时候,就只需要往里面传入这个实现类的一个对象就可以了
这样,我们就可以引入现定义现使用的概念了,那就是:
如果你想要调用这个方法的话,你只需要直接创建一个Runnable接口的实现类的对象就可以了
而你为什么要定义这个类呢?
当使用匿名内部类的时候,表示类体的{}紧跟在构造方法之后(此句重要)
匿名内部类的使用场合:
当试图创建接口或者抽象类对象的时候,就使用内部匿名类
即:匿名类一般不主动定义,而是当创建一个已有接口或抽象类而不想要定义一个新的类的时候,才需要使用匿名内部类来实现抽象方法
匿名内部类会产生.class(自解码)文件,名称是classname$1/2/3/4...
匿名内部类能定义的和能直接访问的都和普通的局部内部类完全一致