我们可以通过反射,获取对应的运行时类中所有的属性、方法、构造器、父类、接口、父类的泛型、包、注解、异常等。。。。
典型代码:
package java1;
/**
* @author wkq
* @date 2020/3/9 - 22:07
*/
@MyAnnotation(value = "hi")
public class Person extends Creature<String> implements MyInterface, Comparable<String> {
private String name;
int age;
public int id;
public Person() {
}
@MyAnnotation(value = "abc")
private Person(String name) {
this.name = name;
}
Person(String name, int age) {
this.name = name;
this.age = age;
}
@MyAnnotation
private String show(String nation) {
System.out.println("我的国际是" + nation);
return nation;
}
public String display(String insterest) {
return insterest;
}
private static String displayStatic(String insterest) {
System.out.println("我喜欢" + insterest);
return insterest;
}
@Override
public void info() throws NullPointerException, RuntimeException {
System.out.println("我是一个人");
}
@Override
public int compareTo(String o) {
return 0;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", id=" + id +
'}';
}
}
@Test
public void test01() {
Class<Person> clazz = Person.class;
//获取属性结构
//getFields():获取当前运行时类及其父类中声明为public访问权限的属性
Field[] fields = clazz.getFields();
for (Field field : fields)
System.out.println(field);
System.out.println();
//getDeclaredFields():获取当前运行时类中声明的所属性。(不包含父类中声明的属性)
Field[] declaredFields = clazz.getDeclaredFields();
for (Field field : declaredFields) {
System.out.println(field);
}
System.out.println();
for (Field field : declaredFields) {
//权限修饰符
int modifier = field.getModifiers();
//数据类型
Class<?> type = field.getType();
//变量名
String name = field.getName();
System.out.println(Modifier.toString(modifier) + " " + type.getName() + " " + name);
}
}
运行结果
public int java1.Person.id
public int java1.Creature.weightprivate java.lang.String java1.Person.name
int java1.Person.age
public int java1.Person.idprivate java.lang.String name
int age
public int id
@Test
public void test1(){
Class clazz = Person.class;
//getMethods():获取当前运行时类及其所父类中声明为public权限的方法
Method[] methods = clazz.getMethods();
for(Method m : methods){
System.out.println(m);
}
System.out.println();
//getDeclaredMethods():获取当前运行时类中声明的所方法。(不包含父类中声明的方法
Method[] declaredMethods = clazz.getDeclaredMethods();
for(Method m : declaredMethods){
System.out.println(m);
}
}
运行结果
public java.lang.String java1.Person.toString() public int
java1.Person.compareTo(java.lang.String) public int
java1.Person.compareTo(java.lang.Object) public void
java1.Person.info() throws
java.lang.NullPointerException,java.lang.RuntimeException public
java.lang.String java1.Person.display(java.lang.String) public final
void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws
java.lang.InterruptedException public final native void
java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object) public native
int java.lang.Object.hashCode() public final native java.lang.Class
java.lang.Object.getClass() public final native void
java.lang.Object.notify() public final native void
java.lang.Object.notifyAll()
public java.lang.String java1.Person.toString() public int
java1.Person.compareTo(java.lang.String) public int
java1.Person.compareTo(java.lang.Object) public void
java1.Person.info() throws
java.lang.NullPointerException,java.lang.RuntimeException public
java.lang.String java1.Person.display(java.lang.String) private
java.lang.String java1.Person.show(java.lang.String) private static
java.lang.String java1.Person.displayStatic(java.lang.String)
/*
获取构造器结构
*/
@Test
public void test1(){
Class clazz = Person.class;
//getConstructors():获取当前运行时类中声明为public的构造器
Constructor[] constructors = clazz.getConstructors();
for(Constructor c : constructors){
System.out.println(c);
}
System.out.println();
//getDeclaredConstructors():获取当前运行时类中声明的所的构造器
Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
for(Constructor c : declaredConstructors){
System.out.println(c);
}
}
/*
获取运行时类的父类
*/
@Test
public void test2(){
Class clazz = Person.class;
Class superclass = clazz.getSuperclass();
System.out.println(superclass);
}
/*
获取运行时类的带泛型的父类
*/
@Test
public void test3(){
Class clazz = Person.class;
Type genericSuperclass = clazz.getGenericSuperclass();
System.out.println(genericSuperclass);
}
在BaseDAO会用到
/*
获取运行时类的带泛型的父类的泛型
代码:逻辑性代码 vs 功能性代码
*/
@Test
public void test4(){
Class clazz = Person.class;
Type genericSuperclass = clazz.getGenericSuperclass();
ParameterizedType paramType = (ParameterizedType) genericSuperclass;
//获取泛型类型
Type[] actualTypeArguments = paramType.getActualTypeArguments();
// System.out.println(actualTypeArguments[0].getTypeName());
System.out.println(((Class)actualTypeArguments[0]).getName());
}
/*获取运行时类实现的接口*/
@Test
public void test5(){
Class clazz = Person.class;
Class[] interfaces = clazz.getInterfaces();
for(Class c : interfaces){
System.out.println(c);
}
System.out.println();
//获取运行时类的父类实现的接口
Class[] interfaces1 = clazz.getSuperclass().getInterfaces();
for(Class c : interfaces1){
System.out.println(c);
}
}
/*
获取运行时类所在的包
*/
@Test
public void test6(){
Class clazz = Person.class;
Package pack = clazz.getPackage();
System.out.println(pack);
}
/*
获取运行时类声明的注解
*/
@Test
public void test7(){
Class clazz = Person.class;
Annotation[] annotations = clazz.getAnnotations();
for(Annotation annos : annotations){
System.out.println(annos);
}
}