zoukankan      html  css  js  c++  java
  • Java 反射机制(二)

      《Core Java Volume I --- Fundamentals》介绍了三种创建Class对象的方法。本文将举例说明这三种创建Class对象---创建类的方法。

    一、public final native Class<?>  getClass()

      Object类中的getClass()方法将返回一个Class类型的实例,即一个具体的类(为Class的对象)。

    1)Class未参数化,即API为Class getClass()

           


    输出结果class reflection.Employee

    返回值分析:class + 类完全限定名

    2)Class参数化,约束传入参数继承类型

    3)Class参数化,指定具体约束参数

    代码分析getClass()默认返回值为Class<?>,即参数类型未定。因此必须要强制类型转换成Class<Employee>

    如果需要去掉返回结果中的关键字class,那么使用Class类的API---String getName()

    1 public String getName() {
    2     if (name == null)
    3         name = getName0();
    4     return name;
    5 }
    6 
    7 // cache the name to reduce the number of calls into the VM
    8 private transient String name;
    9 private native String getName0();

    输出结果reflection.Employee

    二、public static Class<?> forName(String className) 

      通过调用java.lang.Class的静态方法forName获得类名对应的Class对象。

    1 public static Class<?> forName(String className) 
    2                 throws ClassNotFoundException {
    3     return forName0(className, true,ClassLoader.getCallerClassLoader());
    4 }

      其中传入的参数String className必须是完全限定名,即包名加类名。

      说明forName方法只有在className是与getName返回格式相同的类名或者接口名时才能够执行成功,否则forName方法抛出ClassNotFoundException异常。另外一点,forName方法是用于手工加载类。

    输出结果:class reflection.Employee

        

      小结一下:getName返回的字符串格式是,包名+类名,不包括项目名。因此forName字符串格式也为,包名+类名。这与JDBC中利用forName静态方法加载驱动类略有区别

    三、class<T> T.class,其中T代表数据类型

    输出结果

    class reflection.Employee
    int
    class java.lang.Integer
    interface java.lang.Runnable

    分析代码:曾经不求甚解的我一直以为此处class是一个属性,不过在写这篇博客时,我明白了之前的观点是错误的。首先,从Eclipse代码的高亮来看,class就是关键字;其次int是基本数据类型,不可能具有属性。综上几点原因,可以总结如下:如果T是任意的Java类型,T.class将代表与其匹配的类型

    四、总结反思

      Class对象实际上表示的是数据类型(基本或引用数据类型),而这个类型并非一定是类

          

      当然,从这里可以看出Class<int>允许参数是基本数据类型,与泛型要求必须是引用数据类型是不同的。可以当作一个特例来记忆。

    参考文献

    Core Java Volume I --- Fundamentals   Cay S. Horstmann  Gary Cornell 著    

      声明:文章系作者原创整理,如需转载请联系本人。

  • 相关阅读:
    HasnMap的一种遍历方式:Map.Entry 和 Map.entrySet()
    Java中常见的几个乱码问题以及解决方法
    浅谈JavaScript--this指向
    数据挖掘深入理解和学习路径
    数据分析学习路线
    C#索引器
    浅谈浅拷贝与深拷贝
    词频统计(统计两个连在一起的词出现的频数)
    第一周 词频统计
    莫比乌斯反演总结
  • 原文地址:https://www.cnblogs.com/forget406/p/5493970.html
Copyright © 2011-2022 走看看