【译】2. Java反射——Class对象
原文地址: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反射——注解 中会有详细介绍。
========================================================================================
- 目录
这是一个本教程到目前为止涵盖的主题列表:
- Java反射——引言
- Java反射——Class对象
- Java反射——构造函数
- Java反射——字段
- Java反射——方法
- Java反射——Getter和Setter
- Java反射——私有字段和私有方法
- Java反射——注解
- Java反射——泛型
- Java反射——数组
- Java反射——动态代理
- Java反射——类的动态加载和重新加载
(敬请期待下一篇翻译)
【译】2. Java反射——Class对象的更多相关文章
- Java 反射 Class对象
Java 反射 Class对象 @author ixenos 关键字:RTTI.动态绑定.动态加载.获得Class引用.泛型Class引用.newInstance的坑.JVM中的泛型类型信息 RTTI ...
- Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别
Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别 在工作中遇到一个问题,就是你需要去判断某个字符串是不是对象的某个成员属性名,然后根据判断结果 ...
- Java反射 - 2(对象复制,父类域,内省)
为什么要复制对象?假设有个类Car,包含name,color2个属性,那么将car1对象复制给car2对象,只需要car2.setName(car1.getName)与car2.setColor(ca ...
- java反射构建对象和方法的反射调用
Java反射技术应用广泛,其能够配置:类的全限定名,方法和参数,完成对象的初始化,设置是反射某些方法.可以增强java的可配置性. 1.1 通过反射构建对象(无参数): 例如我们使用 ReflectS ...
- 【译】Java中的对象序列化
前言 好久没翻译simple java了,睡前来一篇. 译文链接: http://www.programcreek.com/2014/01/java-serialization/ 什么是对象序列化 在 ...
- Java反射获取对象VO的属性值(通过Getter方法)
有时候,需要动态获取对象的属性值. 比如,给你一个List,要你遍历这个List的对象的属性,而这个List里的对象并不固定.比如,这次User,下次可能是Company. e.g. 这次我需要做一个 ...
- 第五课 JAVA反射获取对象属性和方法(通过配置文件)
Service1.java package reflection; public class Service1 { public void doService1(){ System.out.print ...
- 用Java反射输出对象的所有属性的值
获取对象的类类型 Class cls = obj.getClass(); 用类类型获取属性数组 getFields()获取的是共有属性 getDeclaredFields()可以获取所有属性 Fiel ...
- 第五课 JAVA反射获取对象属性和方法
package com.hero; import java.lang.reflect.Field; public class TestReflction5 { public static void m ...
随机推荐
- Debian下配置防火墙iptables
debian下iptables输入命令后即时生效,但重启之后配置就会消失,可用iptables-save快速保存配置,因为Debian上iptables是不会保存规则的,然后在开机自动的时候让ipta ...
- CSS3圆角详解(border-radius)
1.CSS3圆角的优点 传统的圆角生成方案,必须使用多张图片作为背景图案.CSS3的出现,使得我们再也不必浪费时间去制作这些图片了,而且还有其他多个优点: 减少维护的工作量.图片文件的生成.更新.编写 ...
- PHP的爬虫框架
Beanbun PHPSpider PHPQuery QueryList PHPCrawer Snoopy
- How to split DMG on macOS
hdiutil segment /users/test/test1.dmg -segmentsize 4000m -o /users/test/test2.dmg
- poj-1236(强连通分量)
题意:给你n个点,每个点可能有指向其他点的单向边,代表这个点可以把软件传给他指向的点,然后解决两个问题, 1.问你最少需要给几个点,才能使所有点都能拿到软件: 2.问你还需要增加几条单向边,才能使任意 ...
- Django中Form组件的使用
Form介绍 HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入 ...
- HTML5获取地理位置信息
<!DOCTYPE html> <html> <head> <title>Location</title> <meta charset ...
- Codeforces Round #483 Div. 1
A:首先将p和q约分.容易发现相当于要求存在k满足bk mod q=0,也即b包含q的所有质因子.当然不能直接分解质因数,考虑每次给q除掉gcd(b,q),若能将q除至1则说明合法.但这个辣鸡题卡常, ...
- android打电话方法(直接拨通)
新建了CallPhone方法,如下: private void CallPhone() { String number = et_number.getText().toString(); if (Te ...
- 洛谷P1402 酒店之王
传送门:>Here< 题意:有N个人去酒店,酒店共有P个房间,Q道菜.已知每个人喜欢特定的几个房间和几道菜,一个人是满意的当且仅当住了喜欢的房间,吃了喜欢的菜(一个人只能选一个房间一道菜) ...