反射的操作以及工厂代理

反射

(一)所有的框架技术最核心的技术就是反射支持。是分析反射机制之中的所有的组成单元问题,并且利用反射进行类的使用。
(二)反射源头—class类。
所有的反射操作都是通过这个类展开的,首先观察类的定义结构。
类的声明:final类,Class类不能有子类,JDK1.5引入了泛型,在反射中非常糟糕
JDK1.0时候开始提供,这个类的构造方法并不能直接使用,被私有化了,要取得实例对象,在JAVA中提供有三种类型。

1、取得class对象

	调用的三种方式:
	(1)public final Class<?> getClass,那么表示所有的类的**实例化对象**都可以调用此方法。
	(2)使用类.class形式。
	
	这样的操作形式,只有在框架技术中使用。以上两种操作方式有一个本质相同:类必须存在。
	(3)利用Class类提供的方法实例化对象:
			Class.forName("包名.类名")
			
	利用Class.forName进行Class类对象取得,最大的特征是可以在类不存在时候保持编译的正确性

2、反射与工厂设计模式

	(1)通过Class对象获取实例化对象
		public T newInstance()  throws InstantiationException,IllegalAccessException
		避免耦合,采用工厂设计模式。利用对象的向上转型为接口对象实例化。
		
	(2)工厂方法:略

3、取得类定义结构

	 整个反射机制中,Class是一切操作的源头。			

在这里插入图片描述在这里插入图片描述

4、操作构造方法

在这里插入图片描述
取得Constructor对象后,可操纵这个类的方法。
在这里插入图片描述
这里newInstance也是取得该构造方法所属类的实例化对象。

5、操作方法

反射最大的用处----针对方法的操作。在反射机制里面,普通方法可以保存对象状态的情况下进行各种操作。所以来讲,在反射的操作过程中,必须掌握方法的调用过程。
在这里插入图片描述
取得Method类后,可调用类中以下方法。
在这里插入图片描述
在这里插入图片描述
整个Method最重要的操作方法 invoke,。
一般new再调用方法的缺点:代码结构严谨,关键字new、明确指定了一个类的对象。
反射调用:一个类有实例化对象的情况下才能调用。第一个参数就是实例化对象

6、操作成员

在这里插入图片描述
在取得继承的成员变量,只能获取非私有化的成员。
在这里插入图片描述
直接操作属性是不允许出现的,若所有属性是private封装的,但是可以解除的:field、method、Constructor的父类-----AccessibleObject。

SetAccessible(true)取消封装

7、jsp对反射支持。

在这里插入图片描述

8、取得注解

注解:节约了代码检查时间,节约了配置文件编写。尤其是servlet配置的过程里面,利用注解可以解决配置文件过多的问题。‘
操作注解,就要知道取得配置注解 。
取得在类中和方法上的注解:
在这里插入图片描述
有些注解无法取得,运行期是RUNTIME

9、自定义注解

在这里插入图片描述
在java.lang.annotation.RetentionPolicy
在这里插入图片描述
在这里插入图片描述
在使用注解的地方就可以使用name和value了
在这里插入图片描述
Annotation是所有注解的父类,如果想用自己的方法,必须向下转型。

10、classLoader类基本作用

ClassLoader属于类加载器,默认情况下只能加载classpath中的程序类,但是很多时候不一定非要一个classpath下载,可能通过远程服务器加载。那么这个时候用户就必须编写自己的类加载器。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
一个用户自定义的类都是用扩展加载器加载的,但是java.util.Date或者是java.lang.String上是自己的类加载器的,在java里面为了保证程序安全,提供了一个概念----双生加载。
如果是系统类库则使用自己的加载器无法控制,如果用户有需要也可以定义特定的加载器,两个没有冲突。
目的:为了程序安全。就算定义了重名的类名称,也不会加载

如果清楚了类加载器的概念。就清楚了:用户可以定义自己的类加载器 ,继承ClassLoader类完成。
在这里插入图片描述
目的是为了让用户继承使用,但是不能直接使用。如果已经得到程序的文件信息,那么可以使用ClassLoader类以下方法加载:
在这里插入图片描述
在这里插入图片描述
以上的类加载是否提供没有 任何关系,最有用处的类加载器一定可以通过远程加载。
在这里插入图片描述
,没有包存在。那么一定要使用io流读取数据。
ClassLoader类里面提供有一个将字节数组变成类文件的转换方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果想让代码变得更有意义,可以放在服务器上。

加载服务器上的代码:

在这里插入图片描述
这些类加载器都是由用户自己提供的。
在这里插入图片描述

11、代理基本结构

代理设计模式本质特点:一个真实业务主题只完成核心操作,而所有与之辅助的功能都由代理类完成。
在这里插入图片描述
所以此时就一定需要编写代理类。
在这里插入图片描述

业务层现在并不关心到底是代理类还是真是主题类,他只关心:只要取得了IDeptDAO接口对象,就可以,那么这一个操作就可以通过工厂设计类来实现隐藏。
在这里插入图片描述
此时业务层暂时不再需要进行,只需要客户端模拟业务层调用就可。
在这里插入图片描述

12、动态代理设计模式

之前给出的代理模式的确可以完成代理要求,但是有一个问题:现在你的项目里有两百张数据表,那么至少也需要200个左右的DAO接口,那么就很繁琐。
以上属于静态代理模式,只能够作为代理模式的雏形出现,并不能够实际使用 的设计模式,为此,在java中专门引入了动态代理设计模式的概念。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值