zoukankan      html  css  js  c++  java
  • 三种方法获取Class对象的区别

    有关反射的内容见   java反射

    得到某个类的Class对象有三种方法:

    使用“类名.class”取得

    Class.forName(String className)

    通过该类实例对象的getClass()

    三种方法有何不同?

    类名.class      不做类的初始化工作,返回类的Class对象。

    Class.forName(String className)     做类的静态初始化,返回类的Class对象。

    ( 如果使用Class.forName(String name, boolean initialize,ClassLoader loader) ,并将initialize的值设为false,则不会进行类的静态初始化)

    实例对象的getClass()                对类进行静态初始化、非静态初始化(由于首先使用new得到类的实例对象,实际上是这一步对类进行了初始化)。

    如下示例:

    定义一个类Apple,使用上述三种方法分别得到Apple类的Class对象

    class Apple {
    
        // 构造器
        public Apple() {
            System.out.println("This is a constructor");
        }
    
        // 非静态块
        {
            System.out.println("This is a block");
        }
    
        // 静态块
        static {
            System.out.println("This is a static block");
        }
    }

    使用“类名.class”

        public static void main(String[] args) throws Exception {
    
            Class<?> appleClass = Apple.class;
        }

    没有任何输出结果。没有对类做初始化。

    Class.forName(String className)

        public static void main(String[] args) throws Exception {
            Class.forName("leetcode.Apple");
        }

    输出:This is a static block

    说明对类Apple进行了静态初始化

    通过该类实例对象的getClass()

        public static void main(String[] args) throws Exception {
            Apple apple = new Apple(); // 对类做了初始化
            Class<?> appleClass = apple.getClass();
        }

    输出:

    This is a static block
    This is a block
    This is a constructor

    对类做初始化的实际是创建类的实例时。

  • 相关阅读:
    记录此刻的感受(2018年8月26日19:44)
    提高工作效率
    VS C++项目报错warning C4199: ……use /Zc:twoPhase-
    dll加载遇到的问题
    记录xerces使用(VS2017 C++)
    vs编译应用程序不依赖运行vs环境
    [Locked] Binary Tree Vertical Order Traversal
    [Locked] Group Shifted Strings
    [Locked] Graph Valid Tree
    [Locked] Flatten 2D Vector
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/9405630.html
Copyright © 2011-2022 走看看