zoukankan      html  css  js  c++  java
  • 重踏学习Java路上_Day27(反射,模式设计,jdk新特性)

    1:反射(理解)
    (1)类的加载及类加载器
    (2)反射:
    通过字节码文件对象,去使用成员变量,构造方法,成员方法
    (3)反射的使用
    A:通过反射获取构造方法并使用
    B:通过反射获取成员变量并使用
    C:通过反射获取成员方法并使用
    (4)反射案例
    A:通过反射运行配置文件的内容
    B:通过反射越过泛型检查
    C:通过反射给任意的一个对象的任意的属性赋值为指定的值
    (5)动态代理

    2:设计模式
    (1)装饰设计模式
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    Scanner sc = new Scanner(System.in);
    (2)模版设计模式

    3:JDK新特性
    (1)JDK5(掌握)
    装箱和拆箱
    泛型
    增强for
    静态导入
    可变参数
    枚举
    (2)JDK6(了解)
    (3)JDK7(理解)
    二进制的表现形式
    用_分隔数据
    switch语句可是用字符串
    泛型推断(菱形泛型)
    多catch的使用
    自动释放资源的用法
    (4)JDK8(了解)
    可以去网上了解资料

    ----------------------------------------------------------------------------------------------------------------------------------------------

    类的加载
    当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。
    加载
    就是指将class文件读入内存,并为之创建一个Class对象。
    任何类被使用时系统都会建立一个Class对象。
    连接
    验证 是否有正确的内部结构,并和其他类协调一致
    准备 负责为类的静态成员分配内存,并设置默认初始化值
    解析 将类的二进制数据中的符号引用替换为直接引用
    初始化 就是我们以前讲过的初始化步骤


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


    类加载器
    负责将.class文件加载到内在中,并为之生成对应的Class对象。
    虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行。
    类加载器的组成
    Bootstrap ClassLoader 根类加载器
    Extension ClassLoader 扩展类加载器
    Sysetm ClassLoader 系统类加载器

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

    通过反射获取构造方法并使用
    获取构造方法
    getConstructors
    getDeclaredConstructors
    创建对象
    newInstance()
    con.newInstance(“zhangsan", 20);

    通过反射获取成员变量并使用
    获取所有成员
    getFields,getDeclaredFields
    获取单个成员
    getField,getDeclaredField
    修改成员的值
    set(Object obj,Object value)   将指定对象变量上此 Field 对象表示的字段设置为指定的新值。

    通过反射获取成员方法并使用
    获取所有方法
    getMethods
    getDeclaredMethods
    获取单个方法
    getMethod
    getDeclaredMethod
    暴力访问
    method.setAccessible(true);

    动态代理
    动态代理
    代理:本来应该自己做的事情,却请了别人来做,被请的人就是代理对象。
    举例:春季回家买票让人代买
    动态代理:在程序运行过程中产生的这个对象
    而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以,动态代理其实就是通过反射来生成一个代理

    在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口就可以生成动态代理对象。JDK提供的代理只能针对接口做代理。我们有更强大的代理cglib
    Proxy类中的方法创建动态代理类对象
    public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
    最终会调用InvocationHandler的方法
    InvocationHandler
    Object invoke(Object proxy,Method method,Object[] args)

    Proxy类中创建动态代理对象的方法的三个参数;
    ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
    Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
    InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上

    每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的invoke 方法来进行调用。

    InvocationHandler接口中invoke方法的三个参数:
    proxy:代表动态代理对象
    method:代表正在执行的方法
    args:代表调用目标方法时传入的实参

    Proxy.newProxyInstance
    创建的代理对象是在jvm运行时动态生成的一个对象,它并不是我们的InvocationHandler类型,
    也不是我们定义的那组接口的类型,而是在运行是动态生成的一个对象,并且命名方式都是这样的形式,
    以$开头,proxy为中,最后一个数字表示对象的标号。
    System.out.println(u.getClass().getName());


    枚举
    枚举概述
    是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。举例:一周只有7天,一年只有12个月等。
    回想单例设计模式:单例类是一个类只有一个实例
    那么多例类就是一个类有多个实例,但不是无限个数的实例,而是有限个数的实例。这才能是枚举类。

    格式是:只有枚举项的枚举类
    public enum 枚举类名 {
    枚举项1,枚举项2,枚举项3…;
    }

    注意事项
    定义枚举类要用关键字enum
    所有枚举类都是Enum的子类
    枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略
    枚举类可以有构造器,但必须是private的,它默认的也是private的。枚举项的用法比较特殊:枚举(“”);
    枚举类也可以有抽象方法,但是枚举项必须重写该方法
    枚举在switch语句中的使用,JDK7新特性

    枚举类中的几个常见方法
    int compareTo(E o)
    String name()
    int ordinal()
    String toString()
    <T> T valueOf(Class<T> type,String name) values()
    此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便

    模版设计模式
    模版设计模式概述
    模版方法模式就是定义一个算法的骨架,而将具体的算法延迟到子类中来实现
    优点
    使用模版方法模式,在定义算法骨架的同时,可以很灵活的实现具体的算法,满足用户灵活多变的需求
    缺点
    如果算法骨架有修改的话,则需要修改抽象类

    装饰设计模式
    装饰设计模式概述
    装饰模式就是使用被装饰类的一个子类的实例,在客户端将这个子类的实例交给装饰类。是继承的替代方案
    优点
    使用装饰模式,可以提供比继承更灵活的扩展对象的功能,它可以动态的添加对象的功能,并且可以随意的组合这些功能
    缺点
    正因为可以随意组合,所以就可能出现一些不合理的逻辑

  • 相关阅读:
    Count and Say leetcode
    Find Minimum in Rotated Sorted Array II leetcode
    Find Minimum in Rotated Sorted Array leetcode
    Search in Rotated Sorted Array II leetcode
    search in rotated sorted array leetcode
    Substring with Concatenation of All Words
    Subsets 子集系列问题 leetcode
    Sudoku Solver Backtracking
    Valid Sudoku leetcode
    《如何求解问题》-现代启发式方法
  • 原文地址:https://www.cnblogs.com/canceler/p/4649842.html
Copyright © 2011-2022 走看看