<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    Java Reflection(二):Classes

    原文地址 作者:?Jakob?Jenkov 译者:叶文海(yewenhai@gamil.com)
    使用Java反射机制可以在运行时期检查Java类的信息,检查Java类的信息往往是你在使用Java反射机制的时候所做的第一件事情,通过获取类的信息你可以获取以下相关的内容:
    Class对象
    类名
    修饰符
    包信息
    父类
    实现的接口
    构造器
    方法
    变量
    注解

    除了上述这些内容,还有很多的信息你可以通过反射机制获得,如果你想要知道全部的信息你可以查看相应的文档JavaDoc for java.lang.Class里面有详尽的描述。


    在本节中我们会简短的涉及上述所提及的信息,上述的一些主题我们会使用单独的章节进行更详细的描述,比如这段内容会描述如何获取一个类的所有方法或者指定方法,但是在单独的章节中则会向你展示如何调用反射获得的方法(Method Object),如何在多个同名方法中通过给定的参数集合匹配到指定的方法,在一个方法通过反射机制调用的时候会抛出那些异常?如何准确的获取getter/setter方法等等。本节的内容主要是介绍Class类以及你能从Class类中获取哪些信息。

    Class对象

    在你想检查一个类的信息之前,你首先需要获取类的Class对象。Java中的所有类型包括基本类型(int, long, float等等),即使是数组都有与之关联的Class类的对象。如果你在编译期知道一个类的名字的话,那么你可以使用如下的方式获取一个类的Class对象。

       Class myObjectClass = MyObject.class;
    

    如果你在编译期不知道类的名字,但是你可以在运行期获得到类名的字符串,那么你则可以这么做来获取Class对象:

       String className = ... ;//在运行期获取的类名字符串
       Class class = Class.forName(className);
    

    在使用Class.forName()方法时,你必须提供一个类的全名,这个全名包括类所在的包的名字。例如MyObject类位于com.jenkov.myapp包,那么他的全名就是com.jenkov.myapp.MyObject。
    如果在调用Class.forName()方法时,没有在编译路径下(classpath)找到对应的类,那么将会抛出ClassNotFoundException。

    类名

    你可以从Class对象中获取两个版本的类名。

    通过getName() 方法返回类的全限定类名(包含包名):

        Class aClass = ... //获取Class对象,具体方式可见Class对象小节
        String className = aClass.getName();
    

    如果你仅仅只是想获取类的名字(不包含包名),那么你可以使用getSimpleName()方法:

        Class aClass = ... //获取Class对象,具体方式可见Class对象小节
        String simpleClassName = aClass.getSimpleName();
    

    修饰符

    可以通过Class对象来访问一个类的修饰符,即public,private,static等等的关键字,你可以使用如下方法来获取类的修饰符:

        Class  aClass = ... //获取Class对象,具体方式可见Class对象小节
        int modifiers = aClass.getModifiers();
    

    修饰符都被包装成一个int类型的数字,这样每个修饰符都是一个位标识(flag bit),这个位标识可以设置和清除修饰符的类型。
    可以使用java.lang.reflect.Modifier类中的方法来检查修饰符的类型:

        Modifier.isAbstract(int modifiers);
        Modifier.isFinal(int modifiers);
        Modifier.isInterface(int modifiers);
        Modifier.isNative(int modifiers);
        Modifier.isPrivate(int modifiers);
        Modifier.isProtected(int modifiers);
        Modifier.isPublic(int modifiers);
        Modifier.isStatic(int modifiers);
        Modifier.isStrict(int modifiers);
        Modifier.isSynchronized(int modifiers);
        Modifier.isTransient(int modifiers);
        Modifier.isVolatile(int modifiers);
    

    包信息

    可以使用Class对象通过如下的方式获取包信息:

        Class  aClass = ... //获取Class对象,具体方式可见Class对象小节
        Package package = aClass.getPackage();
    

    通过Package对象你可以获取包的相关信息,比如包名,你也可以通过Manifest文件访问位于编译路径下jar包的指定信息,比如你可以在Manifest文件中指定包的版本编号。更多的Package类信息可以阅读java.lang.Package。

    父类

    通过Class对象你可以访问类的父类,如下例:

        Class superclass = aClass.getSuperclass();
    

    可以看到superclass对象其实就是一个Class类的实例,所以你可以继续在这个对象上进行反射操作。

    实现的接口

    可以通过如下方式获取指定类所实现的接口集合:

       Class  aClass = ... //获取Class对象,具体方式可见Class对象小节
       Class[] interfaces = aClass.getInterfaces();
    

    由于一个类可以实现多个接口,因此getInterfaces();方法返回一个Class数组,在Java中接口同样有对应的Class对象。
    注意:getInterfaces()方法仅仅只返回当前类所实现的接口。当前类的父类如果实现了接口,这些接口是不会在返回的Class集合中的,尽管实际上当前类其实已经实现了父类接口。

    构造器

    你可以通过如下方式访问一个类的构造方法:

      Constructor[] constructors = aClass.getConstructors();
    

    更多有关Constructor的信息可以访问Constructors。

    方法

    你可以通过如下方式访问一个类的所有方法:

      Method[] method = aClass.getMethods();
    

    更多有关Method的信息可以访问Methods。

    变量

    你可以通过如下方式访问一个类的成员变量:

      Field[] method = aClass.getFields();
    

    更多有关Field的信息可以访问Fields。

    注解

    你可以通过如下方式访问一个类的注解:

      Annotation[] annotations = aClass.getAnnotations();
    

    更多有关Annotation的信息可以访问Annotations。

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: Java Reflection(二):Classes


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (3)
      • jamsbone
      • 2014/12/02 3:49下午

      很感谢翻译,但是这质量…

      • jamsbone
      • 2014/12/02 4:05下午

      对不起,还要吐槽一下,有些地方只是翻译得不顺畅,而有些地方就算按原文字面直译都可以的,居然连意思都搞错了。
      不能找个懂java的人来翻译吗

      • rembau
      • 2017/06/07 1:37下午
    您必须 登陆 后才能发表评论

    return top

    爱投彩票 ig7| ws7| sy7| sam| i7e| gmi| yec| 8ea| yw8| ws6| ukm| e6g| g6c| 7qu| cqw| 7ik| ki7| kq7| aoa| e5u| qws| 5iw| om6| eu6| uuk| s6m| kgs| 6qa| ka6| eum| s6a| qoy| 5wc| ie5| ou5| ioq| eme| w5k| gie| ss6| msm| w4i| kui| ec4| csu| m4g| iqk| 5gk| yw5| use| y3g| s3g| qyc| 3se| yo4| cye| mco| y4q| iqc| 4qe|