Java反射之获取类的标识符

来源:互联网 发布:面对网络舆论你怎么看 编辑:程序博客网 时间:2024/06/03 17:51

上一篇文章讲了如果获得一个类的类名,有没有什么办法可以获取到类的访问权限、是否是接口、是否是static类,是否final标识、是否strictfg标识等,获取类的注解等。
答案是肯定的。
访问权限、接口标识、static标识,final标识、strictfp标识等这些都是标识Class的标识符。
可以通过Class.getModifiers()获取,然后自己做遍历判断。
Class.getAnnotations()是获取Class的注解的方式。
更多的Class方法可以参考官方文档。
贴一个官方的例子:

import java.lang.annotation.Annotation;import java.lang.reflect.Modifier;import java.lang.reflect.Type;import java.lang.reflect.TypeVariable;import java.util.Arrays;import java.util.ArrayList;import java.util.List;import static java.lang.System.out;public class ClassDeclarationSpy {    public static void main(String... args) {    try {        Class<?> c = Class.forName(args[0]);        out.format("Class:%n  %s%n%n", c.getCanonicalName());        out.format("Modifiers:%n  %s%n%n",               Modifier.toString(c.getModifiers()));        out.format("Type Parameters:%n");        TypeVariable[] tv = c.getTypeParameters();        if (tv.length != 0) {        out.format("  ");        for (TypeVariable t : tv)            out.format("%s ", t.getName());        out.format("%n%n");        } else {        out.format("  -- No Type Parameters --%n%n");        }        out.format("Implemented Interfaces:%n");        Type[] intfs = c.getGenericInterfaces();        if (intfs.length != 0) {        for (Type intf : intfs)            out.format("  %s%n", intf.toString());        out.format("%n");        } else {        out.format("  -- No Implemented Interfaces --%n%n");        }        out.format("Inheritance Path:%n");        List<Class> l = new ArrayList<Class>();        printAncestor(c, l);        if (l.size() != 0) {        for (Class<?> cl : l)            out.format("  %s%n", cl.getCanonicalName());        out.format("%n");        } else {        out.format("  -- No Super Classes --%n%n");        }        out.format("Annotations:%n");        Annotation[] ann = c.getAnnotations();        if (ann.length != 0) {        for (Annotation a : ann)            out.format("  %s%n", a.toString());        out.format("%n");        } else {        out.format("  -- No Annotations --%n%n");        }        // production code should handle this exception more gracefully    } catch (ClassNotFoundException x) {        x.printStackTrace();    }    }    private static void printAncestor(Class<?> c, List<Class> l) {    Class<?> ancestor = c.getSuperclass();    if (ancestor != null) {        l.add(ancestor);        printAncestor(ancestor, l);    }    }}

执行结果:

$ java ClassDeclarationSpy java.util.concurrent.ConcurrentNavigableMapClass:  java.util.concurrent.ConcurrentNavigableMapModifiers:  public abstract interfaceType Parameters:  K VImplemented Interfaces:  java.util.concurrent.ConcurrentMap<K, V>  java.util.NavigableMap<K, V>Inheritance Path:  -- No Super Classes --Annotations:  -- No Annotations --
$ java ClassDeclarationSpy "[Ljava.lang.String;"Class:  java.lang.String[]Modifiers:  public abstract finalType Parameters:  -- No Type Parameters --Implemented Interfaces:  interface java.lang.Cloneable  interface java.io.SerializableInheritance Path:  java.lang.ObjectAnnotations:  -- No Annotations --
$ java ClassDeclarationSpy java.io.InterruptedIOExceptionClass:  java.io.InterruptedIOExceptionModifiers:  publicType Parameters:  -- No Type Parameters --Implemented Interfaces:  -- No Implemented Interfaces --Inheritance Path:  java.io.IOException  java.lang.Exception  java.lang.Throwable  java.lang.ObjectAnnotations:  -- No Annotations --
$ java ClassDeclarationSpy java.security.IdentityClass:  java.security.IdentityModifiers:  public abstractType Parameters:  -- No Type Parameters --Implemented Interfaces:  interface java.security.Principal  interface java.io.SerializableInheritance Path:  java.lang.ObjectAnnotations:  @java.lang.Deprecated()