原文地址: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. Spring Boot 框架学习 (一)配置并运行Spring Boot 框架

    下载开发工具: 下载完成打开以后,第一步检查环境 查看jdk是否配置: 接着一定要注意,maven通常情况下它是没有给你配置的,要自行配置: 右键新建: 然后依赖选择web.跟Mybatis就行了. ...

  2. 利用Python制作简单的小程序:IP查看器

    前言 说实话,查看电脑的IP,也挺无聊的,但是够简单,所以就从这里开始吧.IP地址在操作系统里就可以直接查看.但是除了IP地址,我们也想通过IP获取地理地址和网络运营商情况.IP地址和地理地址并没有固 ...

  3. Puppet日常总结

    在工作中常常会有这样一种需求:某几个人需要某些测试服务器的root权限.比如,开发部门的张三,李四,王五,赵六需要rsync服务器的root权限.有些同学会说那直接 visudo在里面添加几个人不就行 ...

  4. python数据结构与算法第十七天【概率算法】

    1. 古典概率 例如:麻将开始摸到的14张牌中无将的概率,两张相同的牌即为将,则有: 所有的情况:从136张牌中选出14张牌,为C136-14 无将的情况:将不同的牌分组,共有34组,依次取14张牌, ...

  5. Hibernate **关于hibernate4.3版本之后org.hibernate.service.ServiceRegistryBuilder被弃用**

    之前一直都是使用hibernate4.2.21的我,有一天突然没有使用本地的jar包而是让IDEA自动下载最新版本的hibernate5.2.2之后,发现有几个经常使用的方法报错了. //创建配置对象 ...

  6. jaxp的dom方式操作(查找、添加、修改、删除、遍历节点)

    package cn.itcast.jaxptest; import java.io.IOException; import javax.xml.parsers.DocumentBuilder;imp ...

  7. rand和randn

    1,rand 生成均匀分布的伪随机数.分布在(0~1)之间 主要语法:rand(m,n)生成m行n列的均匀分布的伪随机数 rand(m,n,'double')生成指定精度的均匀分布的伪随机数,参数还可 ...

  8. Auth模块使用方法大全

    auth认证 导包 from django.contrib import auth 默认数据库中使用auth_user表 创建超级用户 python manage.py createsuperuser ...

  9. UOJ275 [清华集训2016] 组合数问题 【Lucas定理】【数位DP】

    题目分析: 我记得很久以前有人跟我说NOIP2016的题目出了加强版在清华集训中,但这似乎是一道无关的题目? 由于$k$为素数,那么$lucas$定理就可以搬上台面了. 注意到$\binom{i}{j ...

  10. project 2013 设置工期为1个工作日,但开始时间与结束时间不是同一天

    1.问题描述 project2013在工期栏输入  1  ,在开始时间结束时间点自动安排,就会出现如下情况,会被误认为是两天 2.问题解决 文件-->选项-->常规-->日期格式选择 ...