Java Reflection(二):Classes

转载自并发编程网 – ifeve.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文件中指定包的版本编号。

父类

通过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();

方法

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

  Method[] method = aClass.getMethods();

变量

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

  Field[] method = aClass.getFields();

注解

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

Annotation[] annotations = aClass.getAnnotations();

原文地址 作者: Jakob Jenkov 译者:叶文海([email protected])

时间: 2024-08-10 16:50:35

Java Reflection(二):Classes的相关文章

Java Reflection 教程

转载自 并发编程网 – ifeve.com Java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息.反射还可以让我们在运行期实例化对象,调用方法,通过调用get/set方法获取变量的值. Java反射机制功能强大而且非常实用.举个例子,你可以用反射机制把Java对象映射到数据库表,就像Butterfly Persistence(译者注:原作者所编写的框架)所做的那样,或者把脚本中的一段语句在运行期映射到相应的对象调用方法上,就

Java reflection

http://www.journaldev.com/1789/java-reflection-tutorial-for-classes-methods-fields-constructors-annotations-and-much-more#reflection-fields Reflection in Java Reflection for Classes Get Class Object Get Super Class Get Public Member Classes Get Decla

Java Reflection 相关及示例

Java Reflection 相关及示例 前言: 代码有点长.贴出github地址:https://github.com/andyChenHuaYing/scattered-items/tree/master/items-java-reflection 测试目标类:TargetClass.自定义的辅助类比较多.在这里不贴了.篇幅有限.并且测试也简单.因此测试类也没有提及. 一:简介 Java Reflection是针对Class也就是我们平常说的类而言的.用于操作Java中的Class.在Ja

Java Reflection API | Java.lang.Class

ref: http://www.studytonight.com/java/reflection-api Reflection API reflection means ability of a software to analyze itself. In java, Reflection API provides facility to analyze and change runtime behavior of a class, at runtime For Example, using r

Spark用Java实现二次排序的自定义key

本人在研究Spak,最近看了很多网上的对于SPARK用Java实现二次排序的方法,对于自定义key的做法 基本上都是实现Ordered<>接口,重写$greater.$greater$eq.$less.$less$eq.compare.compareTo方法,定义hashCode.equals····· 感觉好麻烦,其实我们自定义key只是用了里面的compareTo方法,其他的$greater.$greater$eq.$less.$less$eq.compare 不用做任何改动,hashCo

Java实现二维码技术探讨。

Java生成二维码方法有三种: 1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode/downloads/28391/qrcode.zip 这个是日本人写的,生成的是我们常见的方形的二维码 能够用中文 如:5677777ghjjjjj 2: 使用BarCode4j生成条形码和二维码 BarCode4j网址:http://sourceforge.net/

Java实验二实验报告:java面向对象程序设计

java实验二实验报告 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等).解决办法(空洞的方法如“查网络”.“问

java 生成 二维码 和jquery 生成二维码

生成二维码 Java 生成二维码: 思路为拿到jar 包知道里面的方法使用 Step one : 在https://github.com/zxing中下载(点击网页中名为 zxing 的a标签,跳转到源码页面,点击release 查看所有发布的源码,下载zip压缩文件 Step two:  解压文件后打开文件夹,将core包和javase包 中的com包拷贝到一java项目src目录下.右键导出 jar file  得到一个二维码开发的jar包 Step three: 进行二维码制作 impor

JAVA笔记二

JAVA笔记二 常量:表示不可改变的值 变量:将不确定的数据进行存储也就是需要在内存中开辟一个空间 如何开辟内存空间? 就是通过明确的的数据类型 变量名称 数据来完成 Integer.toBinaryString(number); JAVA提供转换二进制的方法; number表示转换成二进制的数字 两个变量不通过第三个变量进行两个值得交换 1.int a=3,b=8; a=a+b; a=a-b; b=a-b; 此方法有局限性比如说a+b的大于2^32-1就会出现错误 我们可以通过异或运算来进行交