「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 方法。

注意

  • 不要过多地使用反射,其不适合编写应用程序。反射是很脆弱的,编译器很难帮助人们发现程序中的错误,因此很有可能会导致运行时出现异常。
posted @ 2017-10-14 16:44  hiwangzi  阅读(123)  评论(0编辑  收藏  举报