一个类可以被申明一个到多个影响它运行时行为的修饰符.
访问修饰符:public,protected,private;
需要重写的修饰符:abstract;
限制一个实例的修饰符的static;
禁止被修改的修饰符:final;
强制准确的浮点行为的strictfp;
注解
这些修饰符不是对所有的类都适合.如一个接口就不能为final,一个枚举不能是抽象的.java.lang.reflect.Modifier包含了所有可能的修饰符申明.
访问修饰符:public,protected,private;
需要重写的修饰符:abstract;
限制一个实例的修饰符的static;
禁止被修改的修饰符:final;
强制准确的浮点行为的strictfp;
注解
这些修饰符不是对所有的类都适合.如一个接口就不能为final,一个枚举不能是抽象的.java.lang.reflect.Modifier包含了所有可能的修饰符申明.
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("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");
}
} 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);
}
}
}