java知识点(二)--反射以及代理模式原理分析。
1. 什么是反射
反射(Reflection)就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。反射是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的內部信息,并能直接操作任意对象的内部属性及方法。
Java反射机制主要提供了以下功能:
在运行时构造任意一个类的对象
在运行时获取任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法(属性)
2. 获取Class对象的三种方式
1.通过类名获取 类名.class
2.通过对象获取 对象名.getClass()
3.通过全类名获取 Class.forName(全类名)
3. 静态代理
目的:
(1)通过引入代理对象的方式来间接访问目标对象,防止直接访问目标对象给系统带来的不必要复杂性;
(2)通过代理对象对原有的业务增强;
举个例子:
我们假设有一个生产茅台酒的类,其内部肯定会有一个制造酒的方法。 客户A想买酒,就必须调用这个方法,然后才能买到酒。假设客户A和酒厂之间相隔万里,A不能每次为了买一点酒,就要不远万里去酒厂买酒。 这个时候就需要一个中间人帮客户从酒厂买好酒 (同时也可以对这个酒进行包装,类似中介) 然后送给客户A,这样不但给A省了很多烦恼,也让酒厂不必面对所有客户,只生产酒就行。 我们把这个中间人称为代理类。对外,代理类也应该有制造酒这个功能,给客户调用,所以我们需要抽离出一个制造酒的接口。让茅台酒,和代理类都实现这个接口。同时对内,代理类自己是不会真正造酒的,所以我们需要代理类持有酒厂的一个对象。在客户需要买酒的时候,内部去调用酒厂的方法。以上就是一个静态代理的简单例子
用代码实现如下:
制造酒的接口:
制造酒的接口茅台酒类:
实现了MakeWinery接口,才能生产代理类:
代理类可以提供额外的业务逻辑对生产酒的方法进行包装。调用:
客户在想买酒,可以直接找到代理,跳过Maotai,且代理能提供更好的服务静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类。一般来说,被代理对象和代理对象是一对一的关系,或者,一个代理对象对应多个被代理对象也是可以的
思考一下,当我们还想要各种各样品牌的酒时,就需要创建N个代理类,或者在一个代理类中,创建多个代理对象,这显然违背了java设计模式里面的开闭原则,第一种方法对象量多、代码量大,从而导致代码复杂,可维护性差的问题事。而第二种方式则会出现扩展能力差的问题。因此,变引入了我们的动态代理模式。