一.泛型
1.1什么是泛型
泛型:定义时没有明确参数的类型,使用时明确类型,看到=>泛型的定义,只有<>泛型操作符,不一定看到T就是泛型方法,只是使用了反省的普通方法
守门员,编译阶段检查了类型是否一致,避免了向下转型的强制类型转换的出错问题
泛型类:
T和E称为类型参数,占位符
class MyClass<单个大写字母,T,E,…>{
T val;
E val2;
}
MyClass<Integer,String> cls = new MyClass<>();
泛型方法:
//只是使用了类型参数的普通方法
public T test(T t){
}
//泛型方法,返回值和参数都使用了泛型
public fun(T t){
}
泛型方法始终以自己定义的类型参数为准,和类中的泛型参数无关
1.2泛型方法和使用
泛型除了用在类声明上,也可以单独来定义方法-一个类是普通类仍然也可以定义泛型方法
在泛型类中定义了泛型方法
1.3泛型接口
泛型还可以声明在接口,一旦一个接口使用泛型声明,子类在实现接口时就有两种选择
a.继续保留泛型
b.子类明确当前的类型
1.4通配符
1.?通配符,只能定义在方法中,表示可以接收所有类型的泛型类
2.?extends类:设置泛型上限
3.<?super类>规定泛型下线-地板
此时明确知道了子类,不管?是啥类型,都一定是String的父类,设置一个String对象,天然都is a 父类
a.由于此时明确的是下限,明确的是子类是谁,由于子类天然的是父类,可以设置值
b.super下限通配符,只能用在方法内部,不能在类中定义。
1.5类型擦除
泛型只是编译阶段的语法塘
泛型类和普通类进入JVM之后,没有任何区别
javac->.java编译为.class之后,泛型就没了
类型擦除:泛型信息其实只存在与编译阶段,进入JVM后,会将所有和泛型相关的信息擦除掉。
若没有规定泛型上限,则所有泛型信息都擦除为Object类型
若规定泛型上限,则擦除为相应的泛型上限类型
二.反射
2.1什么是反射
反射(一切框架的基础):在JVM运行时
对于JVM中任何一个类,都能动态的获取该类所有属性和方法。
对于JVM中任何一个对象,都能动态的调用该对象的属性和方法。
动态获取信息以及调用对象机制称为反射机制。
运行时类型RTTI
编译时类型
Person p = new Student();//p的编译时类型Person,运行时类型就是Student
运行时明确该引用到底是啥类型就可以通过反射机制。
2.2反射相关的类
1.无论要通过反射机制干啥事,首先第一步就是获取该类的class对象(由JVM产生,全局唯一)
a.调用class.forNam(类的全名称,包名.类名)
b.调用类名称.class属性Student.class
c.通过该类的任意对象的getClass方法()
由JVM产生,全局唯一
2.通过反射调用构造方法
普通的get只能获取public权限的方法或者属性
getDeclared…()可以获取所有权限的方法或属性
破坏封装产生对象
3.通过反射调用普通方法