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文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便

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

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

  • 相关阅读:
    编译redis时 提示make cc Command not found
    【netty】Netty系列之Netty百万级推送服务设计要点
    [nginx]Nginx禁止访问robots.txt防泄漏web目录
    【linux】 linux 查看系统信息
    [spring] java.lang.reflect.MalformedParameterizedTypeException
    【spring】non-compatible bean definition of same name and class
    【java】serialVersionUID作用
    【架构】生成全局唯一ID的3个思路,来自一个资深架构师的总结
    [linux]BASH 的基本语法
    [linux] linux 破解版confluence安装
  • 原文地址:https://www.cnblogs.com/canceler/p/4649842.html
Copyright © 2011-2022 走看看