一、注解Annotation
1、注解概述
注释+解释:不是程序本身,而是对其做出解释,并能被其它程序读取。
格式:@注释名(参数)
定义注解的关键字:@interface
2、常见的内置注解:
@Override重写覆盖方法
@Desperated已过时的,不推荐程序员使用的(但是使用也不会错)
@SuppressWarnings()镇压警告,用来抑制编译时的警告信息(不建议使用)
3、元注解
用来解释注解的注解,Java定义了四个标准的元注解:
@Target 描述注解的使用范围,即描述该注解可以在哪些地方(字段/类/方法...)使用
@Retention (建议定义为RUNTIME)描述需要在什么级别保存该注视信息(source<class<runtime),描述注解的生命周期
@Documented 描述是否将我们的注解生成在JAVAdoc中
@Inherited 表示子类可以继承父类的注解
4、自定义注解@interface(注意和接口interface的区别)
定义注解的参数:参数类型+参数名();
注意:
- 参数名一定要加括号();
- 如果定义的注解有参数,则使用该注解时必须要加参数,否则会报错(除非该参数定义了默认值);
- 如果只有一个参数,一般定义参数名为value
二、反射机制Reflection
1、反射概述
反射使Java语言从静态变为了动态语言(在运行的时候可以动态改变自身结构,如javascript)。
反射机制能实现程序在运行时获取任意类的内部信息,并能直接操作任意对象的内部属性和方法。
主要API:
- java.lang.Class:代表一个类
- java.lang.reflect.Method:代表类的方法
- java.lang.reflect.Field:代表类的成员变量
- java.lang.reflect.Constructor:代表类的构造器
一个类在内存中只有一个class对象,一个类被加载后,类的整个结构都会被封装在class对象中。
2、Class类
- 在Object类中定义了getClass方法,此方法将被所有的子类继承。
- 这个方法返回值的类型是一个Class类,这个类是Java反射的源头。
- 实际上所谓的反射:从程序的运行结果来看,就是可以通过对象反射求出类的名称
3、 Class类的常用方法
4、Class类特点
- Class本身是一个类。
- Class对象只能由系统建立对象。
- 一个加载的类在JVM中只会有一个Class实例。
- 一个Class对象对应的是一个加载到JVM中的一个.class文件。
- 每个类的实例都会记得自己是由哪个Class实例所生成。
- 通过Class可以完整地得到一个类中的所有被加载的结构。
- Class类是Reflection的根源,针对任何你想动态加载、运行的类、唯有鲜活的相应的Class对象。
5、获取Class类的几种方式
- 若已知具体的类,可以通过类的class属性获取,该方法最为安全可靠,程序性能最高。
Class clazz = Person.class;
- 若已知某个类的实例,调用该实例的getClass方法获取Class对象。
Class clazz = person.getClass();
- 若一致一个类的全限定类名,且该类的类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException异常。
Class clazz = Class.forName("com.demo.entity.User");
- 内置基本数据类型可以直接用类名.Type获得。
- 还可以利用ClassLoader获得。
6、有了Class对象,我们可以做什么
- 创建类的对象:调用Class对象的newlnstance()方法。
- 类必须有一个无参的构造器。
- 类的构造器的访问权限需要足够。
- 没有无参构造器,是否可以创建对象?可以
- 通过CLass类的getDeclaredConstructor(Class…parameter)取得本类的指定形参类型的构造器。
- 向构造器的形参中传递一个对象数组进去,里面包含了构造器中所需的各个参数。
- 通过Constructor实例化对象。