枚举:
是用来定义有限长度的常量,相对于之前创建的变量更加方便。
注意事项!
1.枚举定义好以后避免修改,继承的不是Objcet类是java.lang.Enum
2.枚举不能有子类因为被final修饰,构造方法也必须私有。
3.在switch中可以直接使用常量名,不用类名.常量名
4.不要提供set方法,要不然创建枚举无意义,也不要定义name属性因为自带了name属性
注解/元注解
注解主要是给包 类 方法做备注的,可以通过反射获取标注的内容,注解在运行时可以嵌入到字节码中。@Override : 重写 *
@FunctionalInterface: 函数式接口 *
SuppressWarnings:抑制编译时的警告信息。 *
1. @SuppressWarnings("unchecked") [^ 抑制单类型的警告]
2. @SuppressWarnings("unchecked","rawtypes") [^ 抑制多类型的警告]
3. @SuppressWarnings("all") [^ 抑制所有类型的警告]元注解:
对于自定义注解的注解,而自定义注解必须有1个Annotation和1-n个 ElenmenType 关联&&有1个Annotation 1个RetentonPoilcy关联Annotation
当 Annotation 与某个 ElementType 关联 时,就意味着:Annotation有了某种用途
RetentionPolicy1.若 Annotation 的类型为 SOURCE ,则意味着: Annotation 仅存在于编译器处理期间,编译器 处理完之后,该 Annotation 就没用了。 例如, " @Override" 标志就是一个 Annotation 。当它修 饰一个方法的时候,就意味着该方法覆盖父类的方法;并且在编译期间会进行语法检查!编译器处 理完后,"@Override" 就没有任何作用了。
b) 若 Annotation 的类型为 CLASS ,则意味着:编译器将 Annotation 存储于类对应的 .class 文件 中,它是 Annotation 的默认行为。
c) 若 Annotation 的类型为 RUNTIME ,则意味着:编译器将 Annotation 存储于 class 文件中,并 且可由JVM读入
格式(1.定义的注解,自动继承了java.lang,annotation.Annotation接口 2.注解中的每一个方法,实际是声明的注解配置参数 3.可以通过 default来声明参数的默认值 如果只有一个参数成员,一般参数名为value 注解元素必须要有值,我们定义注解元素时,经常使用空字符串、 0 作为默认值。)
@interface 自定义注解名{}
反射
JAVA反射机制是在运行状态中,获取任意一个类的结构 , 创建对象 , 得到方法,执行方法 , 属性
类加载器
1.BootstrapClassLoader(引导启动类加载器){C++编写}
2.ExtensionClassLoader(扩展类加载器) {父类BootstrapClassLoader}
3.App ClassLoader(应用类加载器){父加载器为Ext ClassLoader}
得到Calss的方式//这个不是格式只是为了方便理解!!
if(类已经存在){
通过包名.类名.class 得到一个类的 类对象
}else if{
Calls对象.getCalss()得到对象
}else{在编写代码时, 知道类的名称
Class.forName(包名+类名): 得到一个类的 类对象
}
通过class对象 获取一个类的构造方法
1.指定的参数类型获取,单个构造方法
getConstructor(参数类型的class对象数组)
2.获取构造方法数组
getConstructors();
3.获取所有权限的单个构造方法
getDeclaredConstructor(参数类型的class对象数组)
4.获取所有权限的构造方法数组
getDeclaredConstructors();
获取方法:
newInstance(Object... para)
(可访问私有方法)setAccessible(boolean flag)
获取Calls方法
1.getMethod(String methodName , class.. clss) 根据参数列表的类型和方法名, 得到一个方法(public修饰的)
getMethods(); 得到一个类的所有方法 (public修饰的)2.getDeclaredMethod(String methodName , class.. clss) 根据参数列表的类型和方法名, 得到一个方法(除继承以外所有的:包含私有, 共有, 保护, 默认)
getDeclaredMethods();得到一个类的所有方法 (除继承以外所有的:包含私有, 共有, 保护, 默认)
格式;
invoke(Object o,Object... para) :
调用方法 ,
参数1. 要调用方法的对象
参数2. 要传递的参数列表
getName()
获取方法的方法名称
setAccessible(boolean flag)
如果flag为true 则表示忽略访问权限检查 !(可以访问任何权限的方法)
获取属性
1. getDeclaredField(String filedName)根据属性的名称 , 获取一个属性对象 ( 所有属性 )setAccessible(boolean flag) (权限)2. getDeclaredFields()获取所有属性3. getField(String filedName)根据属性的名称 , 获取一个属性对象 (public 属性 )4. getFields()获取所有属性 (public)