爪哇课堂笔记
作者:互联网
爪哇课堂笔记
反射、泛型、容器
day day study day day up
一、反射
-
反射是什么 :Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助ReflectionAPI取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。加载完类之后,在堆内存的方法区中就产生了一个class类型的对象(一个类只有一个class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以称为:反射;
-
为什么要有反射:反射可以赋予jvm动态编译的能力,否则类的元数据信息只能用静态编译的方式实现,例如热加载,Tomcat的classloader等等都没法支持。当我们的程序在运行时,需要动态的加载一些类这些类可能之前用不到所以不用加载到jvm,而是在运行时根据需要才加载,这样的好处对于服务器来说不言而喻,举个例子我们的项目底层有时是用mysql,有时用oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了 ;
2.1. 获取Class的实例的四种方式:
方式一:调用运行时类的属性:.class Class cl1 = Person,class;
方式二:通过运行时类的对象,调用getclass() Person p = new Person();Class cl2 = p.getClass();
方式三:调用Class的静态方法:forName(String classPath); Class cl3 = Class.forName(“全路径”);
方式四:使用类的加载器:ClassLoader; ClassLoader classLoader = Reflection.class.getClassLoader(); Class cl4 = classLoader.loadClass(“全路径”);
2.2. 了解ClassLoader:类加载器作用是用来把类装载进内存的。JVM规范下定义了如下类型的加载器
2.3. Bootstap ClassLoader 引导类加载器:用C++编写的,是JVM自带的类加载器,负责java平台核心库用来装载核心库,该加载器无法直接获取
2.4. Extension ClassLoader 扩展类加载器:负责jre/lib/ext目录下的jar包或者java.ext.dirs指定目录下的jar包转入工作库
2.5. System ClassLoader 系统类加载器:负责java -classpath 或者 -D java.class.path所指目录下的类与jar包装入工作,是最常用的加载器。
二、泛型
- 泛型的设计背景:集合容器类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型声明为object,JDK1.5之后使用泛型来解决。因为这个时候除了元素的类型不确定,其他部分是确定的,例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个参数就叫泛型。Collection < E > ,List < E >,ArrayList < E >这个E就是参数类型,即泛型。;
- 泛型概念:所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时确定。
- 为什么要有泛型,直接Object不是也可以存储数据吗?:解决元素存储安全性问题,好比商品、药品不会弄错。解决获取数据元素时,需要类型强转问题可能出现ClassCastException,泛型的本质是指类型参数化。所有使用泛型参数的地方都被统一化,保证类型的一致。
- 泛型的上下限:
上限 格式:类型名称<? extends 类> 对象名称 意义:只能接收该类型及其子类。
下限 格式:类型名称<? super 类> 对象名称 意义:只能接收该类型及其父类。
三、容器
1.ArrayList
2.LinkedList
3.HashMap
1)HashMap.hash(Object key)
2)关键变量
3)resize
标签:反射,笔记,class,类型,泛型,课堂,爪哇,Class,加载 来源: https://blog.csdn.net/JAVA_WZZ/article/details/117934610