Java反射之获取类的标识符
2017-12-08 16:30
190 查看
上一篇文章讲了如果获得一个类的类名,有没有什么办法可以获取到类的访问权限、是否是接口、是否是static类,是否final标识、是否strictfg标识等,获取类的注解等。
答案是肯定的。
访问权限、接口标识、static标识,final标识、strictfp标识等这些都是标识Class的标识符。
可以通过Class.getModifiers()获取,然后自己做遍历判断。
Class.getAnnotations()是获取Class的注解的方式。
更多的Class方法可以参考官方文档。
贴一个官方的例子:
执行结果:
答案是肯定的。
访问权限、接口标识、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.ConcurrentNavigableMap Class: java.util.concurrent.ConcurrentNavigableMap Modifiers: public abstract interface Type Parameters: K V Implemented 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 final Type Parameters: -- No Type Parameters -- Implemented Interfaces: interface java.lang.Cloneable interface java.io.Serializable Inheritance Path: java.lang.Object Annotations: -- No Annotations --
$ java ClassDeclarationSpy java.io.InterruptedIOException Class: java.io.InterruptedIOException Modifiers: public Type Parameters: -- No Type Parameters -- Implemented Interfaces: -- No Implemented Interfaces -- Inheritance Path: java.io.IOException java.lang.Exception java.lang.Throwable java.lang.Object Annotations: -- No Annotations --
$ java ClassDeclarationSpy java.security.Identity Class: java.security.Identity Modifiers: public abstract Type Parameters: -- No Type Parameters -- Implemented Interfaces: interface java.security.Principal interface java.io.Serializable Inheritance Path: java.lang.Object Annotations: @java.lang.Deprecated()
相关文章推荐
- java 利用反射获取类对象中List的值
- java 反射获取类方法(2)
- java反射(1)获取类的所有
- Java自定义注解和运行时靠反射获取注解
- 通过java反射获取任意对象的字段名及字段值
- java反射之获取类的信息方法(推荐)
- Java自定义注解和运行时靠反射获取注解
- java反射获取一个object属性值代码解析
- Java反射获取属性、方法、构造器
- Java反射获取get和set方法
- java 反射获取方法(3)
- java反射通过字段名获取set、get方法
- Java反射获取成员方法
- Java 反射之获取方法对象
- javassist:增强型的java反射工具,获取方法参数名
- Java 编程下通过反射获取一个类中的方法名和对应参数名
- Java反射获取实体的所有可见属性值,返回Object数组
- java中使用反射获取对象的属性和属性值
- Java反射打印类的信息,包括类的成员函数、成员变量(只获取成员函数)
- java反射获取属性值