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

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

  • 相关阅读:
    Angular--ui-router的使用
    一个简单的俄罗斯方块游戏脚本
    c中使用gets() 提示warning: this program uses gets(), which is unsafe.
    最短路径之Floyd算法
    动态规划求最大子序列
    Mac上编译C++报错
    nginx location匹配规则
    nginx配置入门
    拿什么守护你的Node.JS进程: Node出错崩溃了怎么办? foreverjs, 文摘随笔
    ASP.NET 上的 Async/Await 简介
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/9405630.html
Copyright © 2011-2022 走看看