您的位置:首页 > 编程语言 > Java开发

Java反射之获取类的标识符

2017-12-08 16:30 190 查看
上一篇文章讲了如果获得一个类的类名,有没有什么办法可以获取到类的访问权限、是否是接口、是否是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.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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息