泛型
泛型的本质是数据类型的参数化,可以理解为数据类型的一个占位符(形参),即告诉编译器,在调用泛型时必须传入实际类型。这种参数类型可以用在类,方法和接口中,分别被称为泛型类,泛型方法,泛型接口。
泛型的作用:
起到约束和规范的作用,约束类型属于某一个,规范使用只能用某一种类型。可以让我们业务变得更加清晰和明了并得到了编译时期的语法检查。
使用泛型的类型或者返回值的方法,自动进行数据类型转换。
//泛型类
修饰符 class 类名<代表泛型的变量>{}
//泛型方法
修饰符 <代表泛型的变量> 返回值类型 方法名(参数){}
//泛型接口
修饰符 interface 接口名 <代表泛型的变量> {}
容器
容器是装其他对象的对象,主要分为两大类,即Collection和Map。Collection代表着集合,类似数组,只保存一个数字。而Map则是映射,保留键值对两个值
数组也是一种容器,优势是一种简单的线性序列,可以快速地访问数组元素,效率高;劣质是不灵活,容量需要事先定义好,不能随着需求的变化而扩容
Collection
List--有顺序可重复
Set--无顺序不可重复
Map
Map中键不能重复,如果重复,会被覆盖
注解Annotation
注解是附加再代码中的一些元信息,用于一些工具再编译、运行时进行解析和使用,起到说明、配置的功能
注解可以附加再package,class,method,field等上面,相当于给它们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问
作用:
不是程序本身,可以对程序作出解释。(这一点和注释一样)
可以被其他程序读取(如编译器等)(注解信息处理流程,是注解和注释的重大区别)
格式:@注解名 还可以添加一些参数值,如@SuppressWarnings(value="unchecked")
JDK中的内置注解:
@Override | 只适用修饰方法,表示一个方法声明打算重写超类中的另一个方法声明 |
@Deprecated | 标记过时方法,可用于修饰方法、属性、类,通常是因为很危险或存在更好的选择 |
@SuppressWarnings | 抑制编译时的警告 |
@Functionallnterface | java8支持,标识一个匿名函数或函数式接口 |
@SuppressWarnings注解的常见参数值:
deprecation | 使用了不赞成使用的类或方法的警告 |
unchecked | 执行了未检查的转换时的警告,如当使用集合时没用用泛型来指定集合保存的类型 |
fallthrough | 当Switch程序快直接通往下一种情况而没有Break的警告 |
path | 再类路径、源文件路径等有不存在的路径时的警告 |
serial | 再可序列化的类上确实serialVersionUID定义的警告 |
fianlly | 任何fianlly子句不能正常完成时的警告 |
all | 所有的警告 |
元注解:
@Target--描述注解的使用范围
如@Target(value=ElementType.TYPE)
@Retention--描述注解的生命周期,表示需要在什么级别保存该注释信息
@Documented--生成文档信息的时候保留注解,对类作辅助说明
@Inherited--说明子类继承父类中的该注解
@Repeatable--表示注解可以重复使用
自定义注解
//元注解
public @interface 注解名称{
//属性列表
}
其中的每一个方法实际上是声明了一个配置参数
方法的名称就是参数的名称
返回值类型(只能是基本类型、Class、String、enum)就是参数的类型
可以通过default来声明参数的默认值
如只有一个参数成员,一般参数名为value
反射机制
java不是动态语言,但有一定的动态性,可以用反射机制、字节码操作获得类似动态语言的特性
**反射机制:**在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。
Class class = Class.forName(类名)
加载完类之后,在堆内存中,就产生了一个Class类型的对象,这个对象包含了完整的类的结构信息,我们可以通过这个Class对象看到类的结构。
对象是表示或封装一些数据,一个类被加载后,JVM会创建一个对应该类的Class对象,类的整个结构信息会放到对应的Class对象中。这个对象就像一面镜子,透光镜子看到类的结构。
Class类的实例表示正在运行的java应用程序中的类和接口
常用方法:
//获取包名、类名
clazz.getPackage().getName()//包名
clazz.getSimpleName()//类名
clazz.getName()//完整类名
//获取成员变量定义信息
getFields()//获取所有公开的成员变量,包括继承变量
getDeclaredFields()//获取本类定义的成员变量,包括私有,但不包括继承的变量
getField(变量名)
getDeclaredField(变量名)
//获取构造方法定义信息
getConstructor(参数类型列表)//获取公开的构造方法
getConstructors()//获取所有的公开的构造方法
getDeclaredConstructors()//获取所有的构造方法,包括私有
getDeclaredConstructor(int.class,String.class)
//获取方法定义信息
getMethods()//获取所有可见的方法,包括继承的方法
getMethod(方法名,参数类型列表)
getDeclaredMethods()//获取本类定义的的方法,包括私有,不包括继承的方法
getDeclaredMethod(方法名,int.class,String.class)
//反射新建实例
clazz.newInstance();//执行无参构造创建对象
clazz.newInstance(222,"韦小宝");//执行有参构造创建对象
clazz.getConstructor(int.class,String.class)//获取构造方法
//反射调用成员变量
clazz.getDeclaredField(变量名);//获取变量
clazz.setAccessible(true);//使私有成员允许访问
f.set(实例,值);//为指定实例的变量赋值,静态变量,第一参数给null
f.get(实例);//访问指定实例变量的值,静态变量,第一参数给null
//反射调用成员方法
Method m = Clazz.getDeclaredMethod(方法名,参数类型列表);
m.setAccessible(true);//使私有方法允许被调用
m.invoke(实例,参数数据);//让指定实例来执行该方法