3.查看类的声明

通常类的声明可以包括如下信息:

  • 修饰符
  • 类的名称
  • 类的泛型参数
  • 类的继承类以及实现的接口
  • 类的注解信息

下面将学习如何获得这些信息:
我们将用到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("空");
        }
    }
}

运行之,查看结果:注意(关于类的注解,并不是所有的注解都能获取到的,有些是不能获取的)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/c1776167012/article/details/121503383
3.