zoukankan      html  css  js  c++  java
  • java的灵魂——反射

    前言:
    当我们在类加载的时候,除了把.class文件加载到内存,会把各个类存到各个类模板(class类型)对象
    上,相同的类只有一个类模板对象。
    连接:把类的二进制数据合并到JRE中

    反射
    运行时探究和使用编译时未知的类
    原理:JVM在加载一个类的时候,会把该类的信息存放到一个class对象中,该对象又称为类模板对象,
    JVM可以通过检索该对象,得到这个类所拥有的各种信息(名字、所在包、父类、实现接口……)JDK提供
    API,允许程序员获取到类的class对象,导致程序员也可以检索到这个类的这些信息,即便这个类不是这个
    程序/程序员所实现的。

    操作三步骤:获取到class对象、探究类的信息、使用探究到的类的信息

    一、获取class对象
    1、通过类型名获取class对象(类、接口、数组、基本数据类型、返回类型……)
    Class stuClass=StudentBean.class;
    Class intClass = Integer.TYPE; JDK1.5之前使用包装类来获取基本数据类型对象
    Class intClass = int.class; JDK1.5之后可以直接获取。
    所有的类型都可以获取到class对象,没有动态性,在编写代码时已经知道类型名。

    2、通过实例对象获取class对象
    StudentBean stu = new StudentBean();
    Class stuCladd = stu.getClass();
    只有能产生实例化对象的类型可以通过该方法获取到class对象,包括:非抽象类、数组类型
    因为在编写代码时已经得到实例对象,不具有动态性。

    3、通过类型名的字符串形式获取class对象
    Class stuClass=Class.forName("类全名");
    类和接口可以通过该方式获取class对象,细节:必须填写全类名、先主动完成加载,然后返回class对象
    这是唯一一种动态性的体现,以后会大量使用,表现在各种框架中抒写配置文件。


    二、通过class对象探究类的信息
    1、探究属性——field
    探究所有公共属性——stuClass.getFields();探究所有公共的属性、包括从父类继承而来的
    探究所有已声明属性——stuClass.getDeclaredFields();探究所有本类声明的属性,不包括从父类继承的
    探究指定公共属性——stuClass.getFields("");探究指定公共属性,包括父类的
    探究指定声明属性——stuClass.getDeclaredField("");探究指定本类声明的属性,不包括父类的
    2、探究构造——constructor
    同上
    3、探究方法——method
    同上
    三、使用class对象探究的信息
    1、探究到constructor,就可以产生实例对象
    newInstance(参数,参数)
    2、探究到method,就可以调用方法
    invoke(对象,参数)
    3、探究到field,就可以赋值、取值
    set(对象,参数) get(对象)
    在使用探究到的信息,有一些细节:
    1、第三种产生对象的方式
    2、在反射产生实例对象时,可以直接调用class对象的newInstace方法获取到实例对象,但它只能
    调用公共无参构造,这就是JavaBean的第一规范的原因
    3、私有属性在反射中操作,都是调用它的公共的set、get方法,这就是JavaBean的第二规范的原因——常用
    4、反射是Java的底层实现,其实是可以破坏封装直接操作任意访问修饰符的构造、方法、属性
    setAccessible(true) 设置可访为true(构造、属性、方法)——慎用

  • 相关阅读:
    Hadoop Yarn 框架原理及运作机制及与MapReduce比较
    模型驱动与属性驱动区别
    spark伪分布式的安装
    大数据集群的常见问题
    linux常用命令
    大数据集群ssh登录其他机器失败 RSA host key for zb03 has changed and you have requested strict checking. Host key verification failed.
    Python 地点转化为经纬度
    Hbase原理、基本概念、基本架构
    struts2的java.lang.NoSuchMethodException错误
    抽象工厂
  • 原文地址:https://www.cnblogs.com/fengshaolingyun/p/6785069.html
Copyright © 2011-2022 走看看