static final:定义一系列常量时,一系列静态对象
enum Season { //直接定义一系列对象 SPRING("",""), SUMMER("",""), AUTUMN("",""), WINTER("",""); //字段 private final String seasonName; private final String seasonDesc; //构造方法私有 private Season(String name,String desc){ this.seasonName = name; this.seasonDesc = desc; } //其他方法 }
常用方法 | 说明 |
---|---|
values() | 返回枚举对象数组 |
valueOf(String str) | 字符串转化为对应的枚举对象 |
toString() | 返回当前枚举对象常量的名字 |
能够编译的特殊标记,jdk5.0新增
框架= 注解+反射+设计模式
1.1 生成文档相关注解:
@author 标明作者
@version 版本
@see 参考转向
@since 从哪个版本开始增加
@param 参数说明
@return 返回值说明
@exception 说明异常 throws时
1.2 编译时格式检查:(内置注解)
@override 表示方法重写,只能修饰方法
@Deprecated 修饰方法、属性、类,表示不鼓励使用
@SuppressWarnings 抑制警告
1.3 跟踪代码依赖性替代配置文件:
servlet
1.4 spring事务管理:
1.5自定义注解
注解的本质就是一个Annotation接口
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation { //注解参数: 参数类型 + 参数名();default String name() default ""; int age() default 0; int id() default -1; }
注解其他注解的注解 meta-annotation
Retention使用枚举RetentionPolicy来表示注解保留时期:
源码(编译期),字节码(类加载)或者运行期(JVM中运行)
@Retention(RetentionPolicy.SOURCE),注解仅存于源码
@Retention(RetentionPolicy.CLASS), 默认保留,注解在class字节码文件中存在,运行时无法获得
@Retention(RetentionPolicy.RUNTIME), 注解在class字节码文件中存在,在运行时通过反射获取
自定义注解中使用 @Retention(RetentionPolicy.RUNTIME)
描述注解的使用范围
@Target(ElementType.TYPE) 接口、类、枚举、注解
@Target(ElementType.FIELD) 属性字段、枚举常量
@Target(ElementType.METHOD) 方法
@Target(ElementType.PARAMETER) 方法参数
@Target(ElementType.CONSTRUCTOR) 构造
@Target(ElementType.LOCAL_VARIABLE) 局部变量
@Target(ElementType.ANNOTATION_TYPE) 注解
@Target(ElementType.PACKAGE) 包
@Target(ElementType.TYPE_PARAMETER) 泛型方法、泛型类、泛型接口 (jdk1.8加入)
@Target(ElementType.TYPE_USE) 任意类型除了 class (jdk1.8加入)
说明该注解被包含在javadoc中
说明子类可以继承父类中的该注解
@Inherited注解了的注解修饰了一个父类,如果他的子类没有被其他注解修饰,则它的子类也继承了父类的注解。
说明被这个元注解修饰的注解可以同时作用同一个对象多次,而每次作用注解可以表示不同的含义。
注解中的变量都是成员变量(属性),并且注解中是没有方法的,只有成员变量,变量名就是使用注解括号中对应的参数名,变量返回值注解括号中对应参数类型。
注解属性类型可以有以下列出的类型
1.基本数据类型
2.String
3.枚举类型
4.注解类型
5.Class类型
6.以上类型的一维数组类型
动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制
类名 | 用途 |
---|---|
Class类 | 代表类的实体,在运行的Java应用程序中表示类和接口 |
Field类 | 代表类的成员变量(成员变量也称为类的属性) |
Method类 | 代表类的方法 |
Constructor类 | 代表类的构造方法 |
Class类的实例用于记录对象的类描述信息
通过类名直接获取:类名.class 返回Class对象,再创建实例
通过对象获取:对象名.getClass() Class<? extends 类名>
通过全类名获取:Class.forName(全类名) 返回Class<?>
方法名 | 功能说明 |
---|---|
static Class forName(String name) | 返回指定类名 name 的 Class 对象 |
Object newInstance() | 调用缺省构造函数,返回该Class对象的一个实例 |
Object newInstance(Object []args) | 调用当前格式构造函数,返回该Class对象的一个实例 |
getName() | 返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称 |
Class getSuperClass() | 返回当前Class对象的父类的Class对象 |
Class [] getInterfaces() | 获取当前Class对象的接口 |
ClassLoader getClassLoader() | 返回该类的类加载器 |
Class getSuperclass() | 返回表示此Class所表示的实体的超类的Class |
方法名 | 功能说明 |
---|---|
getField(String name) | 获得某个公有的属性对象 |
getFields() | 获得所有公有的属性对象 |
getDeclaredField(String name) | 获得某个属性对象(包含私有) |
getDeclaredFields() | 获得所有属性对象(包含私有) |
返回的是 Field或数组
Field 对象可以使用getxxx,setxxx(并非类里的方法)
操作私有属性时:先setAccessible(true)
获取字段名,和字段的值:getName();get(对象);
方法名 | 功能说明 |
---|---|
getConstructor(Class...<?> parameterTypes) | 获得该类中与参数类型匹配的公有构造方法 |
getConstructors() | 获得该类的所有公有构造方法 |
getDeclaredConstructor(Class...<?> parameterTypes) | 获得该类中与参数类型匹配的构造方法 |
getDeclaredConstructors() | 获得该类所有构造方法 |
返回Constructor<?>或数组
方法名 | 功能说明 |
---|---|
getMethod(String name, Class...<?> parameterTypes) | 获得该类某个公有的方法 |
getMethods() | 获得该类所有公有的方法 |
getDeclaredMethod(String name, Class...<?> parameterTypes) | 获得该类某个方法(包含私有) |
getDeclaredMethods() | 获得该类所有方法(包含私有) |
返回Method或数组
先获取Method对象 xx
再调用xx.invoke(实例名,参数)来使用此方法,参数为此方法的参数
Field代表类的成员变量(成员变量也称为类的属性)
方法名 | 功能说明 |
---|---|
equals(Object obj) | 属性与obj相等则返回true |
get(Object obj) | 获得obj中对应的属性值 |
set(Object obj, Object value) | 设置obj中对应属性值 |
Method代表类的方法
方法名 | 功能说明 |
---|---|
invoke(Object obj, Object... args) | 传递object对象及参数调用该对象对应的方法 |
Construtor代表类的构造方法
方法名 | 功能说明 |
---|---|
newInstance(Object... initargs) | 根据传递的参数创建类的对象 |
使用代理替代原对象,对于原对象的调用都通过代理
一个代理类完成全部代理功能