反射
java.lang.Class类
方法摘要 | |
---|---|
<U> Class<? extends U> |
asSubclass(Class<U> clazz) 强制转换该 Class 对象,以表示指定的 class 对象所表示的类的一个子类。 |
T |
cast(Object obj) 将一个对象强制转换成此 Class 对象所表示的类或接口。 |
boolean |
desiredAssertionStatus() 如果要在调用此方法时,将要初始化该类,则返回将分配给该类的断言状态。 |
static Class<?> |
forName(String className) 返回与带有给定字符串名的类或接口相关联的 Class 对象。 |
static Class<?> |
forName(String name, boolean initialize, ClassLoader loader) 使用给定的类加载器,返回与带有给定字符串名的类或接口相关联的 Class 对象。 |
<A extends Annotation> A |
getAnnotation(Class<A> annotationClass) 如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。 |
Annotation[] |
getAnnotations() 返回此元素上存在的所有注释。 |
String |
getCanonicalName() 返回《Java Language Specification》中所定义的基础类的规范化名称。 |
Class[] |
getClasses() 返回一个包含某些 Class 对象的数组,这些对象表示属于此 Class 对象所表示的类的成员的所有公共类和接口,包括从超类和公共类继承的以及通过该类声明的公共类和接口成员。 |
ClassLoader |
getClassLoader() 返回该类的类加载器。 |
Class<?> |
getComponentType() 返回表示数组组件类型的 Class 。 |
Constructor<T> |
getConstructor(Class... parameterTypes) 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。 |
Constructor[] |
getConstructors() 返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。 |
Annotation[] |
getDeclaredAnnotations() 返回直接存在于此元素上的所有注释。 |
Class[] |
getDeclaredClasses() 返回 Class 对象的一个数组,这些对象反映声明为此 Class 对象所表示的类的成员的所有类和接口,包括该类所声明的公共、保护、默认(包)访问及私有类和接口,但不包括继承的类和接口。 |
Constructor<T> |
getDeclaredConstructor(Class... parameterTypes) 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。 |
Constructor[] |
getDeclaredConstructors() 返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。 |
Field |
getDeclaredField(String name) 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。 |
Field[] |
getDeclaredFields() 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。 |
Method |
getDeclaredMethod(String name, Class... parameterTypes) 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。 |
Method[] |
getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 |
Class<?> |
getDeclaringClass() 如果此 Class 对象所表示的类或接口是另一个类的成员,则返回的 Class 对象表示该对象的声明类。 |
Class<?> |
getEnclosingClass() 返回基础类的立即封闭类。 |
Constructor<?> |
getEnclosingConstructor() 如果该 Class 对象表示构造方法中的一个本地或匿名类,则返回 Constructor 对象,它表示基础类的立即封闭构造方法。 |
Method |
getEnclosingMethod() 如果此 Class 对象表示某一方法中的一个本地或匿名类,则返回 Method 对象,它表示基础类的立即封闭方法。 |
T[] |
getEnumConstants() 如果此 Class 对象不表示枚举类型,则返回枚举类的元素或 null。 |
Field |
getField(String name) 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。 |
Field[] |
getFields() 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。 |
Type[] |
getGenericInterfaces() 返回表示某些接口的 Type,这些接口由此对象所表示的类或接口直接实现。 |
Type |
getGenericSuperclass() 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。 |
Class[] |
getInterfaces() 确定此对象所表示的类或接口实现的接口。 |
Method |
getMethod(String name, Class... parameterTypes) 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。 |
Method[] |
getMethods() 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。 |
int |
getModifiers() 返回此类或接口以整数编码的 Java 语言修饰符。 |
String |
getName() 以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。 |
Package |
getPackage() 获取此类的包。 |
ProtectionDomain |
getProtectionDomain() 返回该类的 ProtectionDomain 。 |
URL |
getResource(String name) 查找带有给定名称的资源。 |
InputStream |
getResourceAsStream(String name) 查找具有给定名称的资源。 |
Object[] |
getSigners() 获取此类的标记。 |
String |
getSimpleName() 返回源代码中给出的基础类的简称。 |
Class<? super T> |
getSuperclass() 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class 。 |
TypeVariable<Class<T>>[] |
getTypeParameters() 按声明顺序返回 TypeVariable 对象的一个数组,这些对象表示用此 GenericDeclaration 对象所表示的常规声明来声明的类型变量。 |
boolean |
isAnnotation() 如果此 Class 对象表示一个注释类型则返回 true。 |
boolean |
isAnnotationPresent(Class<? extends Annotation> annotationClass) 如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。 |
boolean |
isAnonymousClass() 当且仅当基础类是匿名类时返回 true。 |
boolean |
isArray() 判定此 Class 对象是否表示一个数组类。 |
boolean |
isAssignableFrom(Class<?> cls) 判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口。 |
boolean |
isEnum() 当且仅当该类声明为源代码中的枚举时返回 true。 |
boolean |
isInstance(Object obj) 判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。 |
boolean |
isInterface() 判定指定的 Class 对象是否表示一个接口。 |
boolean |
isLocalClass() 当且仅当基础类是本地类时返回 true。 |
boolean |
isMemberClass() 当且仅当基础类是成员类时返回 true。 |
boolean |
isPrimitive() 判定指定的 Class 对象是否表示一个基本类型。 |
boolean |
isSynthetic() 如果此类是复合类,则返回 true,否则 false。 |
T |
newInstance() 创建此 Class 对象所表示的类的一个新实例。 |
String |
toString() 将对象转换为字符串。 |
java.lang.reflect.Method类
方法摘要 | |
---|---|
boolean |
equals(Object obj) 将此 Method 与指定对象进行比较。 |
<T extend Annotation> |
getAnnotation(Class<T> annotationClass) 如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。 |
Annotation[] |
getDeclaredAnnotations() 返回直接存在于此元素上的所有注释。 |
Class<?> |
getDeclaringClass() 返回表示声明由此 Method 对象表示的方法的类或接口的 Class 对象。 |
Object |
getDefaultValue() 返回由此 Method 实例表示的注释成员的默认值。 |
Class<?>[] |
getExceptionTypes() 返回 Class 对象的数组,这些对象描述了声明将此 Method 对象表示的基础方法抛出的异常类型。 |
Type[] |
getGenericExceptionTypes() 返回 Type 对象数组,这些对象描述了声明由此 Method 对象抛出的异常。 |
Type[] |
getGenericParameterTypes() 按照声明顺序返回 Type 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型的。 |
Type |
getGenericReturnType() 返回表示由此 Method 对象所表示方法的正式返回类型的 Type 对象。 |
int |
getModifiers() 以整数形式返回此 Method 对象所表示方法的 Java 语言修饰符。 |
String |
getName() 以 String 形式返回此 Method 对象表示的方法名称。 |
Annotation[][] |
getParameterAnnotations() 返回表示按照声明顺序对此 Method 对象所表示方法的形参进行注释的那个数组的数组。 |
Class<?>[] |
getParameterTypes() 按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型。 |
Class<?> |
getReturnType() 返回一个 Class 对象,该对象描述了此 Method 对象所表示的方法的正式返回类型。 |
TypeVariable<Method>[] |
getTypeParameters() 返回 TypeVariable 对象的数组,这些对象描述了由 GenericDeclaration 对象表示的一般声明按声明顺序来声明的类型变量。 |
int |
hashCode() 返回此 Method 的哈希码。 |
Object |
invoke(Object obj, Object... args) 对带有指定参数的指定对象调用由此 Method 对象表示的基础方法。 |
boolean |
isBridge() 如果此方法是 bridge 方法,则返回 true;否则,返回 false。 |
boolean |
isSynthetic() 如果此方法为复合方法,则返回 true;否则,返回 false。 |
boolean |
isVarArgs() 如果将此方法声明为带有可变数量的参数,则返回 true;否则,返回 false。 |
String |
toGenericString() 返回描述此 Method 的字符串,包括类型参数。 |
String |
toString() 返回描述此 Method 的字符串。 |
java.lang.Field类
方法摘要 | |
---|---|
boolean |
equals(Object obj) 将此 Field 与指定对象比较。 |
Object |
get(Object obj) 返回指定对象上此 Field 表示的字段的值。 |
<T extends Annotation> |
getAnnotation(Class<T> annotationClass) 如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。 |
boolean |
getBoolean(Object obj) 获得一个静态或实例 boolean 字段的值。 |
byte |
getByte(Object obj) 获得一个静态或实例 byte 字段的值。 |
char |
getChar(Object obj) 获得 char 类型或另一个通过扩展转换可以转换为 char 类型的基本类型的静态或实例字段的值。 |
Annotation[] |
getDeclaredAnnotations() 返回直接存在于此元素上的所有注释。 |
Class<?> |
getDeclaringClass() 返回表示类或接口的 Class 对象,该类或接口声明由此 Field 对象表示的字段。 |
double |
getDouble(Object obj) 获得 double 类型或另一个通过扩展转换可以转换为 double 类型的基本类型的静态或实例字段的值。 |
float |
getFloat(Object obj) 获得 float 类型或另一个通过扩展转换可以转换为 float 类型的基本类型的静态或实例字段的值。 |
Type |
getGenericType() 返回一个 Type 对象,它表示此 Field 对象所表示字段的声明类型。 |
int |
getInt(Object obj) 获得 int 类型或另一个通过扩展转换可以转换为 int 类型的基本类型的静态或实例字段的值。 |
long |
getLong(Object obj) 获得 long 类型或另一个通过扩展转换可以转换为 long 类型的基本类型的静态或实例字段的值。 |
int |
getModifiers() 以整数形式返回由此 Field 对象表示的字段的 Java 语言修饰符。 |
String |
getName() 返回此 Field 对象表示的字段的名称。 |
short |
getShort(Object obj) 获得 short 类型或另一个通过扩展转换可以转换为 short 类型的基本类型的静态或实例字段的值。 |
Class<?> |
getType() 返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。 |
int |
hashCode() 返回该 Field 的哈希码。 |
boolean |
isEnumConstant() 如果此字段表示枚举类型的元素,则返回 true;否则返回 false。 |
boolean |
isSynthetic() 如果此字段是复合字段,则返回 true;否则返回 false。 |
void |
set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。 |
void |
setBoolean(Object obj, boolean z) 将字段的值设置为指定对象上的一个 boolean 值。 |
void |
setByte(Object obj, byte b) 将字段的值设置为指定对象上的一个 byte 值。 |
void |
setChar(Object obj, char c) 将字段的值设置为指定对象上的一个 char 值。 |
void |
setDouble(Object obj, double d) 将字段的值设置为指定对象上的一个 double 值。 |
void |
setFloat(Object obj, float f) 将字段的值设置为指定对象上的一个 float 值。 |
void |
setInt(Object obj, int i) 将字段的值设置为指定对象上的一个 int 值。 |
void |
setLong(Object obj, long l) 将字段的值设置为指定对象上的一个 long 值。 |
void |
setShort(Object obj, short s) 将字段的值设置为指定对象上的一个 short 值。 |
String |
toGenericString() 返回一个描述此 Field (包括其一般类型)的字符串。 |
String |
toString() 返回一个描述此 Field 的字符串。 |
Annotation
注解的定义:
package a.test; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface FirstAnno { String value() default "FirstAnno"; }
package a.test; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Kitto { String value() default "kitto"; }
package a.test; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface SecondAnnotation { // 注释中含有两个参数 String name() default "Hrmzone"; String url() default "hrmzone.cn"; }
在J2SE中内置了三种常用标准注解(Override, Deprecated, SuppressWarnings)以及四种元注解:
@Target: 表示该注解可以用于什么地方。可用ElementType枚举类型主要有:
TYPE : 类、接口或enum声明
FIELD: 域(属性)声明
METHOD: 方法声明
PARAMETER: 参数声明
CONSTRUCTOR: 构造方法声明
LOCAL_VARIABLE:局部变量声明
ANNOTATION_TYPE:注释类型声明
PACKAGE: 包声明
@Retention: 表示需要在什么级别保存该注解信息。可用RetentionPolicy枚举类型主要有:
SOURCE: 注解将被编译器丢弃。
CLASS : 注解在class文件中可能。但会被VM丢弃。
RUNTIME: VM将在运行时也保存注解(如果需要通过反射读取注解,则使用该值)。
@Documented: 将此注解包含在Javadoc中。
@Inherited: 允许子类继承父类中的注解。
注解的实现:
package a.test; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class AnnoTest { public static void main(String[] args) throws ClassNotFoundException { // 要使用到反射中的相关内容 Class c = Class.forName("a.test.Anno"); Method[] method = c.getMethods(); boolean flag = c.isAnnotationPresent(FirstAnno.class); if (flag) { FirstAnno first = (FirstAnno) c.getAnnotation(FirstAnno.class); System.out.println("First Annotation:" + first.value() + "\n"); } List<Method> list = new ArrayList<Method>(); for (int i = 0; i < method.length; i++) { list.add(method[i]); } for (Method m : list) { SecondAnnotation anno = m.getAnnotation(SecondAnnotation.class); if(anno == null) continue; System.out.println("second annotation's\nname:\t" + anno.name() + "\nurl:\t" + anno.url()); } List<Field> fieldList = new ArrayList<Field>(); for(Field f : c.getDeclaredFields()){//访问所有字段 Kitto k = f.getAnnotation(Kitto.class); System.out.println("----kitto anno: " + k.value()); } } }
注解的使用:
package a.test; @FirstAnno("http://hrmzone.cn") public class Anno { @Kitto("测试") private String test = ""; // 不赋值注释中的参数,使用默认参数 @SecondAnnotation() public String getDefault() { return "get default Annotation"; } @SecondAnnotation(name="desktophrm",url="desktophrm.com") public String getDefine() { return "get define Annotation"; } }