黑马程序眼_<<基础加强-----代理>>
---------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! --------------------
代理:就是但一个类中的不能更改,但是需要我们需要一个代理,代理类和原来的 类都是实现的相同的接口,所以代理类中的方法和原类具有相同的方法,那么我们就使用此接口来操作代理类,而不是直接操作原类,可以进行完善方法…等。
系统中存在交叉业务,一个交叉业务就是要切入到系统中的一个方面。
交叉业务的编程问题即为面向方面的编程(Aspect oriented program),其目标就是将交叉业务模块化,例如:安全,事务,日志等功能。
JVM生成的动态类必须实现一个或者多个接口,所以JVM生成的动态类只能用作具有相同接口的目标类的代理。
CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,如果一个要为一个没有实现接口的类生成动态代理类,那么可以使用CGLIB库。
代理类必须和要代理的类实现相同的接口或者类。
代理的各个方法除了通常要调用目标的相应方法和对外返回目标返回结果外,还可以在代理方法中的一下位置加上系统功能代码:
调用目标方法之前
调用目标方法之后
调用目标方法前后
在处理目标方法异常的catch代码中
注意:StringBuilder和StringBuffer的区别:用法是一样的,要是单线程的话,用StringBuilder,对线程用StringBuffer,安全。
2.代理类构造函数和方法
Proxy类,我们获得Connection接口的代理类后,然后查看代理类中的构造函数和方法。输出格式:函数名(参数类型)
System.out.println(Proxy3.getClass().getName());结果:com.sun.proxy.$Proxy0 却不是ArrayList
5.代理实例(框架)
把目标和方法前后的都封装成对象,就可以代理任何对象和对其修饰
package www.fuxi.jiaqiang1.aopframe; import java.io.InputStream; /** * 测试类 * @author yang * */public class ApoFrameworkText { public static void main(String[] args) { InputStream in=ApoFrameworkText.class.getResourceAsStream("config.properties"); Object bean=new BeanFactory(in).getBean("xxx"); System.out.println(bean.getClass().getName()); }}结果:com.sun.proxy.$Proxy0
---------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! --------------------