java知识点(二)--反射以及代理模式原理分析。

2019-08-08  本文已影响0人  yosen

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设计模式里面的开闭原则,第一种方法对象量多、代码量大,从而导致代码复杂,可维护性差的问题事。而第二种方式则会出现扩展能力差的问题。因此,变引入了我们的动态代理模式。

4. 动态代理

5. 动态代理,在java中的实现

上一篇下一篇

猜你喜欢

热点阅读