原文地址:http://tutorials.jenkov.com/java-reflection/classes.html

===========================================================================================

在运行时,你可以用Java反射检查Java类。当你使用反射时,你经常做的第一件事是检查类。从类中你可以获取下列相关信息:

  • 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对象以及你可以从中获取哪些信息。

===========================================================================================

  • The Class Object

  在你能对一个类做任何检查之前,你需要获取该类的java.lang.Class对象。Java中包括原始类型(int, long, float, etc.)和数组在内的所有类型都有一个相关联的Class对象。如果你在编译的时候知道一个类的类名,你可以像下面这样获取一个Class对象:

Class myObjectClass = MyObject.class

  如果在编译的时候你不知道类名,但是在运行时有一个字符串形式的类名,你可以这样做:

String className = ... //obtain class name as string at runtime Class class = Class.forName(className);

  当使用Class.forName()方法时,你必须提供完整有效的类名。这个类名包括完整的包名。例如,如果MyObject位于包com.jenkov.myapp中,那么完整有效的类名为com.jenkov.myapp.MyObject。

  在运行时,如果该类在classpath中找不到,则Class.forName()方法会抛ClassNotFoundException。

===========================================================================================

  • Class Name

  从一个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

  你可以通过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)

===========================================================================================

  • Package Info

  你可以像这样从Class对象中获取包的相关信息:

Class  aClass = ... //obtain Class object. See prev. section
Package package = aClass.getPackage();

从Package对象中,你可以访问像包名这样的信息。你也可以访问在classpath中的JAR包中Manifest文件所指定的该包的信息。例如,你可以在Manifest文件中指定包的版本号。你可以从java.lang.Package中阅读更多和Package类相关的信息。

===========================================================================================

  • Superclass

  你可以用Class对象访问超类。如下:

Class superclass = aClass.getSuperclass();

超类的Class对象和其他类的Class对象一样,所以你也可以继续在超类上用类的反射。

===========================================================================================

  • Implemented Interfaces

可以得到一个给定类实现的接口的列表。如下:

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

一个类可以实现多个接口。因此会返回一个Class类型的数组。在Java反射机制中,接口也是由Class对象来表示的。

注:只有被给定类特别声明实现过的接口才会被返回。如果一个超类实现了一个接口,但是该类没有特别声明它已经实现了这个接口,那么这个接口不会出现在返回的数组中。即使该类实际上在它的超类中实现过该接口。
     要获取一个给定类的完整的所实现接口的列表,你将不得不递归的去查询该类以及它的超类。

===========================================================================================

  • Constructors

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

Constructor[] constructors = aClass.getConstructors();

构造函数在 Java反射——构造函数 中会有详细介绍。

===========================================================================================

  • Methods

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

Method[] method = aClass.getMethods();

  方法在 Java反射——方法 中会有详细介绍。

===========================================================================================

  • Fields

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

Field[] method = aClass.getFields();

字段在 Java反射——字段 中会有详细介绍。

===========================================================================================

  • Annotations

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

Annotation[] annotations = aClass.getAnnotations();

注解在 Java反射——注解 中会有详细介绍。

========================================================================================

  • 目录

  这是一个本教程到目前为止涵盖的主题列表:

  1. Java反射——引言
  2. Java反射——Class对象
  3. Java反射——构造函数
  4. Java反射——字段
  5. Java反射——方法
  6. Java反射——Getter和Setter
  7. Java反射——私有字段和私有方法
  8. Java反射——注解
  9. Java反射——泛型
  10. Java反射——数组
  11. Java反射——动态代理
  12. Java反射——类的动态加载和重新加载

(敬请期待下一篇翻译)

【译】2. Java反射——Class对象的更多相关文章

  1. Java 反射 Class对象

    Java 反射 Class对象 @author ixenos 关键字:RTTI.动态绑定.动态加载.获得Class引用.泛型Class引用.newInstance的坑.JVM中的泛型类型信息 RTTI ...

  2. Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别

    Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别 ​ 在工作中遇到一个问题,就是你需要去判断某个字符串是不是对象的某个成员属性名,然后根据判断结果 ...

  3. Java反射 - 2(对象复制,父类域,内省)

    为什么要复制对象?假设有个类Car,包含name,color2个属性,那么将car1对象复制给car2对象,只需要car2.setName(car1.getName)与car2.setColor(ca ...

  4. java反射构建对象和方法的反射调用

    Java反射技术应用广泛,其能够配置:类的全限定名,方法和参数,完成对象的初始化,设置是反射某些方法.可以增强java的可配置性. 1.1 通过反射构建对象(无参数): 例如我们使用 ReflectS ...

  5. 【译】Java中的对象序列化

    前言 好久没翻译simple java了,睡前来一篇. 译文链接: http://www.programcreek.com/2014/01/java-serialization/ 什么是对象序列化 在 ...

  6. Java反射获取对象VO的属性值(通过Getter方法)

    有时候,需要动态获取对象的属性值. 比如,给你一个List,要你遍历这个List的对象的属性,而这个List里的对象并不固定.比如,这次User,下次可能是Company. e.g. 这次我需要做一个 ...

  7. 第五课 JAVA反射获取对象属性和方法(通过配置文件)

    Service1.java package reflection; public class Service1 { public void doService1(){ System.out.print ...

  8. 用Java反射输出对象的所有属性的值

    获取对象的类类型 Class cls = obj.getClass(); 用类类型获取属性数组 getFields()获取的是共有属性 getDeclaredFields()可以获取所有属性 Fiel ...

  9. 第五课 JAVA反射获取对象属性和方法

    package com.hero; import java.lang.reflect.Field; public class TestReflction5 { public static void m ...

随机推荐

  1. vue & @on-change !== on-change @on-change === @change

    vue & @on-change !== on-change @on-change === @change https://jsfiddle.net/Lasx1fod/ i-switch ht ...

  2. 在IWMS中的分页效果

    第一步,你需要在后台修改你所要显示的新闻数目: 第二步,你需要把这段代码加到你需要分页的列表里边 代码: <%=config.TopAd%><asp:Literal id=" ...

  3. Java8 flatMap的sample

    外国人写得, 很不错 http://www.java67.com/2016/03/how-to-use-flatmap-in-java-8-stream.html package test; impo ...

  4. window.location.href ie 不兼容问题

    今天再做项目演示的时候,用的是ie浏览器报错404,项目都运行好久了,第一次用ie就这样了悲剧,贴下解决方法吧 function getContextPath() { var pathName = d ...

  5. Socket初见

    前端代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <t ...

  6. vi简短教程

    1.模式 命令行模式:光标的移动.内容删除移动复制操作 插入模式:文字输入,即编辑状态 底行模式:文件保存或退出vi,设置编辑环境 2.基本操作 vi myfile,输入vi 文件名,则进入vi. 3 ...

  7. Kafka消费时报错:Producer connection to xxx:9092 unsuccessful

    使用kafka消费数据时报Producer错误,具体错误如下: kafka.producer.SyncProducer:103 Producer connection to xxx:9092 unsu ...

  8. java读取excel获取数据写入到另外一个excel

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  9. BZOJ2038[2009国家集训队]小Z的袜子(hose)——莫队

    题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜子从1到N编号 ...

  10. Linux的Shell练习--个人笔记

    一. 实验准备(预防抄袭,此步必做) 1. 请将提示符设为:学号加波浪号.输入PS1=学号~,如PS1=110015~, 回车执行 2. 如发现提示符.学号不匹配, 视为抄袭或无效 二. 实验项目 1 ...