• 「JavaSE 重新出发」05.03 反射


    Class 类

    在程序运行期间,Java Runtime 为每个类型管理一个 Class 类型的对象。

    • Object 类中的 getClass() 方法将会返回一个 Class 类型的实例。
      Random random = new Random();
      Class cl = random.getClass();
      System.out.println(cl.getName()); // 输出为 java.util.Random
      
    • 还可以调用静态方法 forName 获得类名对应的 Class 对象。
      String className = "java.util.Random";
      Class cl = Class.forName(className);
      
    • 还可以通过 类.class 获得 Class 对象。
      Class cl1 = Random.class;
      Class cl2 = int.class; // 事实上上面的 类.class 这种描述方式并不严谨,Class 对象表示的是一种类型,并不一定只能是类
      Class cl3 = Double[].class;
      
    • 补充:
      • 历史原因,getName 方法有时会返回一个奇怪的名字。
        Double[].class.getName(); // 返回结果为 “[Ljava.lang.Double;”
        int[].class.getName(); // 返回结果为 “[I”
        
      • 虚拟机为每个类型管理一个 Class 对象,因此可以使用 == 进行比较,例如:
        if(e.getClass() == Employee.class)
        
      • 可以通过 newInstance 方法动态地创建一个类的实例
        e.getClass().newInstance(); // 调用默认的无参构造器
        
        • 如果没有无参构造,则会抛出异常; 而对于基本类型来说,例如:int.class.newInstance() 会抛出 InstantiationException 异常
        • 如果希望提供参数,则应使用 Constructor 类中的 newInstance 方法。

    注意

    • 不要过多地使用反射,其不适合编写应用程序。反射是很脆弱的,编译器很难帮助人们发现程序中的错误,因此很有可能会导致运行时出现异常。
  • 相关阅读:
    学习方法:费曼学习方法
    学习方法:天才的秘密
    学习方法:学习的大致过程
    OS:VM虚拟机连不上网络
    cpp:argc和argv的应用
    baidu:{{!!}}
    os:windows许可证书位置
    书法:练字的心得体会
    修复Python终端中敲击方向键显示 [ ^[[A, ^[[B, ^[[C, ^[[D ]
    jquery下removeClass(“oldClassName”).addClass("newClassName")的问题
  • 原文地址:https://www.cnblogs.com/hiwangzi/p/7667777.html
Copyright © 2020-2023  润新知