Java反射 - 类对象

使用Java反射,您可以在运行时检查Java类。在使用Reflection时,检查类往往是你做的第一件事。从课程中你可以获得有关的信息

  • Class Name
  • Class Modifies (public, private, synchronized etc.)
  • Package Info
  • Superclass
  • Implemented Interfaces
  • Constructors
  • Methods
  • Fields
  • Annotations
    加上更多与Java类相关的信息。有关完整列表,您应该查阅java.lang.Class的JavaDoc。本文将简要介绍如何访问上述信息。一些主题也将在单独的文本中进行更详细的审查。例如,这个文本将告诉你如何获得所有的方法或者一个特定的方法,但是一个单独的文本将告诉你如何调用这个方法,如果找到与给定的一组参数相匹配的方法,如果存在多个方法同名,通过反射从方法调用抛出什么异常,如何找到getter / setter等等。本文的目的主要是介绍Class对象和你可以从中获得的信息。

Class对象

在对类进行任何检查之前,您需要获取其java.lang.Class对象。 Java中的所有类型(包括数组的基本类型(int,long,float等))都有一个关联的Class对象。 如果你在编译时知道这个类的名字,你可以像这样获得一个Class对象:

  Class myObjectClass = MyObject.class

如果您在编译时不知道名称,但是在运行时将类名称作为字符串,则可以这样做:

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

使用Class.forName()方法时,您必须提供完全限定的类名称。 这是包括所有包名称的类名称。 例如,如果MyObject位于包com.fantj.refletion中,那么完全限定的类名是com.jenkov.myapp.MyObject

如果在运行时无法在类路径中找到该类,则Class.forName()方法可能会引发ClassNotFoundException。

Class 名

从一个Class对象中你可以得到两个版本的名字。 完全限定的类名(包括包名)是使用getName()方法获得的,如下所示:

    Class aClass = ... //obtain Class object. See prev. section
    String className = aClass.getName();

如果你想要没有包名称的类名,你可以使用getSimpleName()方法获得它,如下所示:

  Class  aClass          = ... //obtain Class object. See prev. section
  String simpleClassName = aClass.getSimpleName();

Modifiers 修改器堆栈(modifier的复数)

您可以通过Class对象访问类的修饰符。 类的修饰符是关键字 "public", "private", "static"等您可以获得这样的类修饰符:

  Class  aClass = ... //obtain Class object. See prev. section
  int modifiers = aClass.getModifiers();

修饰符被打包成一个int,其中每个修饰符都是一个标志位,可以被设置或清除。 您可以在类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 = ... //obtain Class object. See prev. section
Package package = aClass.getPackage();

从Package对象中可以获得有关包的信息,如名称。 您也可以在类路径中访问此程序包所在的JAR文件的Manifest文件中为此程序包指定的信息。 例如,您可以在Manifest文件中指定包版本号。 你可以在这里阅读关于Package类的更多信息:java.lang.Package

Superclass

从Class对象中可以访问类的父类。

Class superclass = aClass.getSuperclass();

父类的对象和其他类一样是一个Class对象,所以你可以继续对它进行类反射。

Implemented Interfaces

可以获得给定类实现的接口列表.

Class  aClass = ... //obtain Class object. See prev. section
Class[] interfaces = aClass.getInterfaces();

一个类可以实现多个接口。 因此返回一个Class数组。 接口也由Java Reflection中的Class对象表示。

注意:只有返回由特定类实现的接口。 如果这个类的父类实现了一个接口,但是这个类并没有明确说明它也实现了这个接口,那么这个接口将不会返回到这个数组中。 即使班级在实践中实现了这个接口,因为超类也是如此。

要获得由给定类实现的接口的完整列表,您将不得不递归地查阅类及其超类。

Constructors

你可以像这样访问一个类的构造函数:

 Constructor[] constructors = aClass.getConstructors();

构造函数在构造函数的文章中有更详细的介绍。Java反射--构造函数

Methods

你可以像这样访问一个类的方法:

 Method[] method = aClass.getMethods();

方法在方法文本中有更详细的介绍。Java反射 - 方法 Methods

Fields

你可以像这样访问类的字段(成员变量):

 Field[] method = aClass.getFields();

field在field文章中有更详细的介绍。Java反射 - 字段

Annotations 注解

您可以像这样访问类的类注解:

 Annotation[] annotations = aClass.getAnnotations();

注释文章中的注释更详细。Java反射 - 注解

项目代码:github链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容