zoukankan      html  css  js  c++  java
  • 关于Java反射机制的几个问题

    1.如何在运行时确定对象类型

    运行时类型识别(Run-time Type Identification, RTTI)主要有两种方式,

    一种是在编译时和运行时已经知道了所有的类型,另外一种是反射机制。

    类型信息在运行时是如何表示的,是由Class对象完成的,它包含了与类有关的信息。
    类是程序的重要组成部分,每个类都有一个Class对象,每当编写并编译了一个新类就会产生一个Class对象,它被保存在一个同名的.class文件中。
    在运行时,当我们想生成这个类的对象时,运行这个程序的Java虚拟机(JVM)会确认这个类的Class对象是否已经加载,
    如果尚未加载,JVM就会根据类名查找.class文件,并将其载入,一旦这个类的Class对象被载入内存,它就被用来创建这个类的所有对象。

    一般的RTTI形式包括三种:
    (1)通过传统的类型转换是否成功判断

    如“(Apple)Fruit”,由RTTI确保类型转换的正确性,如果执行了一个错误的类型转换,就会抛出一个ClassCastException异常。

    (2)通过Class对象来获取对象的类型

    Class c = Class.forName(“Apple”);
    Object o = c.newInstance();
    

    (3)通过关键字instanceof或Class.isInstance()方法来确定对象是否属于某个特定类型的实例
    准确的说,应该是instanceof / Class.isInstance()可以用来确定对象是否属于某个特定类及其所有父类的实例,
    注意和equals() / ==区分,它们用来比较两个对象是否属于同一个类的实例,没有考虑继承关系。

    2.Class下的newInstance()和new()有什么区别

    首先,newInstance( )是一个方法,而new是一个关键字,
    其次,Class下的newInstance()的使用有局限,因为它生成对象只能调用无参的构造函数,而使用new关键字生成对象没有这个限制。
    总结如下:
    Class.forName("")返回的是类;
    Class.forName("").newInstance()返回的是Object。

    3.理解Class.forName()方法

    一般来说,使用Class.forName( )静态方法的目的是为了动态加载类,
    在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。
    因此,使用Class.forName( )最终目的是为了实例化对象。

  • 相关阅读:
    变态的IE
    视频豪横时代,应用如何快速构建视频点播能力?
    阿里云峰会 | 阿里云CDN六大边缘安全能力,全力助推政企数字化转型
    从 2018 年 Nacos 开源说起
    完美日记:实现高弹性高稳定电商架构
    Dubbo 迈出云原生重要一步 应用级服务发现解析
    如何提升微服务的幸福感
    怀里橘猫柴犬,掌上代码江湖——对话阿里云 MVP郭旭东
    云原生时代消息中间件的演进路线
    solr中特殊字符的处理
  • 原文地址:https://www.cnblogs.com/binyue/p/5324022.html
Copyright © 2011-2022 走看看