学习日记49--java学习--反射,jdk新特性

  1. 类的加载概述和加载时机

    • A:类的加载概述
      当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。

      • 加载
        就是指将class文件读入内存,并为之创建一个Class对象。任何类被使用时系统都会建立一个Class对象。
      • 连接

        • 验证 是否有正确的内部结构,并和其他类协调一致
        • 准备 负责为类的静态成员分配内存,并设置默认初始化值
        • 解析 将类的二进制数据中的符号引用替换为直接引用
      • 初始化 就是我们以前讲过的初始化步骤

    • B:加载时机
      • 创建类的实例
      • 访问类的静态变量,或者为静态变量赋值
      • 调用类的静态方法
      • 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
      • 初始化某个类的子类
      • 直接使用java.exe命令来运行某个主类
  2. 类加载器的概述和分类

    • A:类加载器的概述
      • 负责将.class文件加载到内存中,并为之生成对应的Class对象。虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行。
    • B:类加载器的分类
      • Bootstrap ClassLoader 根类加载器
      • Extension ClassLoader 扩展类加载器
      • Sysetm ClassLoader 系统类加载器
    • C:类加载器的作用
      • Bootstrap ClassLoader 根类加载器
        • 也被称为引导类加载器,负责Java核心类的加载
        • 比如System,String等。在JDK中JRE的lib目录下rt.jar文件中
      • Extension ClassLoader 扩展类加载器
        • 负责JRE的扩展目录中jar包的加载。
        • 在JDK中JRE的lib目录下ext目录
      • Sysetm ClassLoader 系统类加载器
        • 负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径
  3. 反射

    • A:反射概述

      • JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
      • 对于任意一个对象,都能够调用它的任意一个方法和属性;
      • 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
      • 要想解剖一个类,必须先要获取到该类的字节码文件对象。
      • 而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。
    • B:三种方式(且这三种方式得到的同一个字节码文件)

      • Object类的getClass()方法,判断两个对象是否是同一个字节码文件
      • 静态属性class,锁对象
      • Class类中静态方法forName(),读取配置文件
    • C:案例演示

      package com.dexuan.reflect;
      
      import com.dexuan.bean.Person;
      
      public class Demo1_Reflect {
      
          /**
           * @param args
           * @throws ClassNotFoundException 
           */
          public static void main(String[] args) throws ClassNotFoundException {
              Class clazz1 = Class.forName("com.dexuan.bean.Person");   //**拿到字节码**首要
              Class clazz2 = Person.class;            //   .class就是转化为字节码文件
      
              Person p = new Person();
              Class clazz3 = p.getClass();
      
              System.out.println(clazz1 == clazz2);
              System.out.println(clazz2 == clazz3);
          }
      }
  4. 通过反射获取带参构造方法
    通过反射获取成员变量
    通过反射获取方法
    ——>反射的作用就是先获取在修改
  5. ArrayList的一个对象,在这个集合中添加一个字符串数据,如何实现呢?
    答:通过反射越过泛型检查。
    泛型只在编译期有效,在运行期会被擦除掉
  6. 十分钟理解 Java 中的动态代理 (https://blog.csdn.net/andyzhaojianhui/article/details/72833114)
  7. JDK5新特性之枚举类
    • A:枚举概述
      是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。举例:一周只有7天,一年只有12个月等。
    • B:回想单例设计模式:单例类是一个类只有一个实例
      那么多例类就是一个类有多个实例,但不是无限个数的实例,而是有限个数的实例。这才能是枚举类。
  8. 枚举的注意事项
    • 定义枚举类要用关键字enum
    • 所有枚举类都是Enum的子类
    • 枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略
    • 枚举类可以有构造器,但必须是private的,它默认的也是private的。
    • 枚举类也可以有抽象方法,但是枚举项必须重写该方法
    • 枚举在switch语句中的使用,因为实例是有限的与switch,case方法更契合
  9. 枚举类的常见方法
    • int ordinal() //枚举项的编号
    • int compareTo(E o) //比较编号
    • String name() //获取实例名称
    • String toString() //toString方法可重写然后调用
    • <T> T valueOf(Class<T> type,String name) //通过字节码对象获取枚举项
    • values() //遍历所有枚举值
      • 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便
  10. JDK7新特性
    • 二进制字面量,可以直接打印二进制数(结果显示为十进制)
    • 数字字面量可以出现下划线:100_00
    • switch 语句可以用字符串
    • 泛型简化,菱形泛型
    • 异常的多个catch合并,每个异常用 或: |
    • try-with-resources 语句,1.7版标准的异常处理代码
  11. JDK8的新特性

    • 接口中可以定义有方法体的方法,如果是非静态,必须用default修饰,静态的则不用
    • 局部内部类在访问他所在方法中的局部变量必须用final修饰,在jdk8中默认有final可以省略。
      public class Demojdk8 {
      
          public static void main(String[] args) {
              Demo d = new Demo();
              d.print();
              Inter.method();   //接口名调用
          }
      }
      
      interface Inter{
          public default void print() {
              System.out.println("Hello world");
          }
      
          public static void method() {
              System.out.println("static method");
          }
      }
      
      class Demo implements Inter{
      }

猜你喜欢

转载自blog.csdn.net/dershine/article/details/82319491