枚举

  • 枚举也是一种引用数据类型 和 类 接口同级别

    • 定义格式

      • public enum 枚举名{}
      • public class Color{

        1. 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,修饰的方法会在测试方法执行之后自动被执行

获取字节码文件对象的三种方式

  1. Object类的 方法
  • Class getClass()
  1. 所有类型都有一个静态的隐藏的class属性 包括基本类型
  • 数据类型.class
  1. Class类的静态方法
  • static Class forName(String className)

反射获取Person类的空参构造方法 并运行

  1. 获取字节码文件对象
  2. 根据字节码文件对象 获取到对应的构造方法

           Class类<br />                          Constructor[ ] getConstuructors()获取所有的公共权限的构造方法
    
  3. 运行空参构造方法

反射获取带参构造方法并运行

  1. 获取字节码文件对象
  2. 获取带参构造方法

    • Class类

      • Constructor getConstructor(Class…paramType)获取指定参数类型的构造方法

                                                              Class...paramType:参数的数据类型 如果是字符串 String.class
        
  3. 运行构造方法

反射获取私有的构造方法并运行

  1. 获取字节码文件对象
  2. 获取指定的私有构造方法

                    Class类<br />                              Constructor[] getDeclaredConstructors() 获取所有构造方法 包括私有<br />                              Constructor getDeclaredConstructor(Class...parameterTypes)获取指定构造方法 可以获取私有
    
  3. 取消访问权限检查

    • AccessibleObject
      • 方法
        • void setAccessible(boolean flag)flag值为true则取消访问权限检查
          • Constructor,Field,Method继承AccessibleObject
  4. 运行构造方法

反射创建对象的快捷方式

  1. 获取字节码文件对象
  2. 直接通过字节码文件对象 反射创建对象

       使用前提<br />                       这个类必须有空参构造方法<br />                       空参构造方法必须可以访问到public<br />           Class类<br />                 Object newInstance()
    

反射 获取Person的setAge和getAge方法并运行

  1. 获取字节码文件对象
  2. 获取指定的方法
    • Class类
      • Method[ ]getMethod()获取所有公共权限的方法 包括继承
      • Method[ ]getDeclaredMethods()获取所有的方法 包括私有 但是不包括继承
      • Method getMethod(String methodName,Class…paramType)通过方法名 和方法的参数类型 获取到指定的方法
      • Method getDeclaredMethod(String methodName,Class…paramType)获取方法 可以获取私有
  3. 运行方法
  • 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()