通常类的声明可以包括如下信息:
- 修饰符
- 类的名称
- 类的泛型参数
- 类的继承类以及实现的接口
- 类的注解信息
下面将学习如何获得这些信息:
我们将用到Class类中的下面关键方法
forName(String className) //根据给定的名称获取Class对象
getAnnotations() 返回此Class对象上存在的注释
getCanonicalName()返回Java Language Specification中所定义的底层类的规范化名称
getGenericInterfaces()返回泛型形式的对象类所实现的接口
getGenericSuperclass()返回泛型形式的对象类所直接继承的父类
getModifiers() 返回此类或接口以整数编码的java语言修饰符,与Modifier.toString()搭配使用
getTypeParameters() 按声明顺序返回TypeVariable(泛型)对象的一个数组
实例测试:
首先编写测试Bean:
package ReflectStudy.Exa141;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/**
* 我是测试的Bean
*/
@Deprecated
public class TestBean<String> implements List {
@Override
public int size() {
return 0;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean contains(Object o) {
return false;
}
@Override
public Iterator iterator() {
return null;
}
@Override
public Object[] toArray() {
return new Object[0];
}
@Override
public boolean add(Object o) {
return false;
}
@Override
public boolean remove(Object o) {
return false;
}
@Override
public boolean addAll(Collection c) {
return false;
}
@Override
public boolean addAll(int index, Collection c) {
return false;
}
@Override
public void clear() {
}
@Override
public Object get(int index) {
return null;
}
@Override
public Object set(int index, Object element) {
return null;
}
@Override
public void add(int index, Object element) {
}
@Override
public Object remove(int index) {
return null;
}
@Override
public int indexOf(Object o) {
return 0;
}
@Override
public int lastIndexOf(Object o) {
return 0;
}
@Override
public ListIterator listIterator() {
return null;
}
@Override
public ListIterator listIterator(int index) {
return null;
}
@Override
public List subList(int fromIndex, int toIndex) {
return null;
}
@Override
public boolean retainAll(Collection c) {
return false;
}
@Override
public boolean removeAll(Collection c) {
return false;
}
@Override
public boolean containsAll(Collection c) {
return false;
}
@Override
public Object[] toArray(Object[] a) {
return new Object[0];
}
}
然后进行程序的编写:
package ReflectStudy.Exa141;
import java.lang.annotation.Annotation;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
/**
* 查看类的声明
*/
public class ClassDeclarationViewer {
public static void main(String[] args) throws ClassNotFoundException {
// 获得ArrayList的Class对象
Class<?> clazz = Class.forName("ReflectStudy.Exa141.TestBean");
System.out.println("类的标准名称:" + clazz.getCanonicalName());
System.out.println("类的修饰符:" + Modifier.toString(clazz.getModifiers()));
// 输出类的泛型参数
TypeVariable<?>[] typeVariables = clazz.getTypeParameters();
System.out.print("类的泛型参数:");
if (typeVariables.length != 0) {
for (TypeVariable<?> typeVariable : typeVariables) {
System.out.println(typeVariable + "\t");
}
} else {
System.out.println("空");
}
// 输出类所实现的所有接口
Type[] interfaces = clazz.getGenericInterfaces();
System.out.println("类所实现的接口:");
if (interfaces.length != 0) {
for (Type type : interfaces) {
System.out.println("\t" + type);
}
} else {
System.out.println("\t" + "空");
}
// 输出类的直接继承类,如果是继承自Object则返回空
Type superClass = clazz.getGenericSuperclass();
System.out.print("类的直接继承类:");
if (superClass != null) {
System.out.println(superClass);
} else {
System.out.println("空");
}
// 输出类的所有注解信息,有些注解信息是不能用反射获得的
Annotation[] annotations = clazz.getAnnotations();
System.out.print("类的注解:");
if (annotations.length != 0) {
for (Annotation annotation : annotations) {
System.out.println("\t" + annotation);
}
} else {
System.out.println("空");
}
}
}
运行之,查看结果:注意(关于类的注解,并不是所有的注解都能获取到的,有些是不能获取的)