枚举
枚举也是一种引用数据类型 和 类 接口同级别
定义格式
- public enum 枚举名{}
public class Color{
public static final Color RED = new Color(); <br /> public static final Color BLUE = new Color();<br /> public static final Color GREEN = new Color();<br /> }
单元测试
定义一个空参数 没有返回值的方法 在方法上加上注解@Test 报错使用 alt+回车 将junit添加到classPath中
需要注意 如果当前包下 有叫Test的类 需要写全类名 org.junit.Test
注意:多线程的代码 不要用单元测试
- 常用注解
- @Test,用于修饰需要执行的测试方法
- @Before,修饰的方法会在测试方法之前被自动执行
- @After,修饰的方法会在测试方法执行之后自动被执行
获取字节码文件对象的三种方式
- Object类的 方法
- Class getClass()
- 所有类型都有一个静态的隐藏的class属性 包括基本类型
- 数据类型.class
- Class类的静态方法
- static Class forName(String className)
反射获取Person类的空参构造方法 并运行
- 获取字节码文件对象
根据字节码文件对象 获取到对应的构造方法
Class类<br /> Constructor[ ] getConstuructors()获取所有的公共权限的构造方法运行空参构造方法
反射获取带参构造方法并运行
- 获取字节码文件对象
获取带参构造方法
Class类
Constructor getConstructor(Class…paramType)获取指定参数类型的构造方法
Class...paramType:参数的数据类型 如果是字符串 String.class
运行构造方法
反射获取私有的构造方法并运行
- 获取字节码文件对象
获取指定的私有构造方法
Class类<br /> Constructor[] getDeclaredConstructors() 获取所有构造方法 包括私有<br /> Constructor getDeclaredConstructor(Class...parameterTypes)获取指定构造方法 可以获取私有取消访问权限检查
- AccessibleObject
- 方法
- void setAccessible(boolean flag)flag值为true则取消访问权限检查
- Constructor,Field,Method继承AccessibleObject
- void setAccessible(boolean flag)flag值为true则取消访问权限检查
- 方法
- AccessibleObject
- 运行构造方法
反射创建对象的快捷方式
- 获取字节码文件对象
直接通过字节码文件对象 反射创建对象
使用前提<br /> 这个类必须有空参构造方法<br /> 空参构造方法必须可以访问到public<br /> Class类<br /> Object newInstance()
反射 获取Person的setAge和getAge方法并运行
- 获取字节码文件对象
- 获取指定的方法
- Class类
- Method[ ]getMethod()获取所有公共权限的方法 包括继承
- Method[ ]getDeclaredMethods()获取所有的方法 包括私有 但是不包括继承
- Method getMethod(String methodName,Class…paramType)通过方法名 和方法的参数类型 获取到指定的方法
- Method getDeclaredMethod(String methodName,Class…paramType)获取方法 可以获取私有
- Class类
- 运行方法
Method类
方法
Object invoke(Object obj,Object…args)运行当前Method所代表的方法
返回Object<br /> 方法运行的返回值 如果没有则返回null<br /> 参数<br /> Object obj:运行方法需要有对象支持 可以使用快捷方法创建<br /> Object...args:方法运行的实际参数<br />类的加载器<br /> BootstrapClassLoader<br /> 根类加载器 负责加载 java的核心类 不是用java语言写的 并不是一个类<br /> ExtClassLoader<br /> 扩展类加载器 负责加载 扩展包下的类<br /> AppClassLoader<br /> 应用加载器 主要负责加载 我们写的类 及第三方jar
这三个类加载器 并没有继承关系
但是
BootstrapClassLoader 是 ExtClassLoader 父加载器
ExtClassLoader 是 AppClassLoader 父加载器类的双亲委托机制
当一个类加载器接受到加载请求时,会将这个请求委托给它的父加载器.
比如app会委托给ext,而ext继续委托给boot.父加载器加载成功就成功了
加载失败 才会让 子加载器加载.boot加载不了,让ext加载,ext加载不了,让app加载双亲委托机制的好处:
-沙箱安全机制:直接写的java.lang.String.class类不会被加载,这样便可以防止核心API库被随意篡改
-避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次,保证被加载类的唯一性获取一个类的 类加载器
类.class.getClassLoader()
