15-5 反射 ---- 获取运行时类的完整结构(1)概述
使用反射可以取得:
1.实现的全部接口:public Class<?>[] getInterfaces()
确定此对象所表示的类或接口实现的接口。
2.所继承的父类:public Class<? Super T> getSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型)的父类的Class。
3.全部的构造器
(1)public Constructor< T >[] getConstructors():返回此 Class 对象所表示的类的所有public构造方法。
(2)public Constructor< T >[] getDeclaredConstructors():返回此 Class 对象表示的类声明的所有构造方法。
(3)Constructor类中:
①取得修饰符: public int getModifiers();
②取得方法名称: public String getName();
③取得参数的类型:public Class<?>[] getParameterTypes();
4.全部的方法
(1)public Method[] getDeclaredMethods():返回此Class对象所表示的类或接口的全部方法
(2)public Method[] getMethods() :返回此Class对象所表示的类或接口的public的方法
(3)Method类中:
①public Class<?> getReturnType()取得全部的返回值
②public Class<?>[] getParameterTypes()取得全部的参数
③public int getModifiers()取得修饰符
④public Class<?>[] getExceptionTypes()取得异常信息
5.全部的Field
(1)public Field[] getFields() :返回此Class对象所表示的类或接口的public的Field。
(2)public Field[] getDeclaredFields() :返回此Class对象所表示的类或接口的全部Field。
(3)Field方法中:
①public int getModifiers() 以整数形式返回此Field的修饰符
②public Class<?> getType() 得到Field的属性类型
③public String getName() 返回Field的名称。
6.Annotation相关
(1)get Annotation(Class< T > annotationClass)
(2)getDeclaredAnnotations()
7.泛型相关
获取父类泛型类型:Type getGenericSuperclass()
泛型类型:ParameterizedType
获取实际的泛型类型参数数组:getActualTypeArguments()
8.类所在的包 Package getPackage()
小 结:
1.在实际的操作中,取得类的信息的操作代码,并不会经常开发。
2.一定要熟悉java.lang.reflect包的作用,反射机制。
3.如何取得属性、方法、构造器的名称,修饰符等。
以下代码的应用见15-5 反射 ---- 获取运行时类的完整结构(2)
父类Creature:
package java2;
import java.io.Serializable;
public class Creature<T> implements Serializable {
private char gender;
public double weight;
private void breath(){
System.out.println("生物呼吸");
}
public void eat(){
System.out.println("生物吃东西");
}
}
注解@Interface MyAnnotation:
package java2;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "hello";
}
接口MyInterface:
package java2;
public interface MyInterface {
void info();
}
Person类:
package java2;
@MyAnnotation(value="hi")
public class Person extends Creature<String> implements Comparable<String>,MyInterface{
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 interests,int age) throws NullPointerException,ClassCastException{
return interests + age;
}
@Override
public void info() {
System.out.println("我是一个人");
}
@Override
public int compareTo(String o) {
return 0;
}
private static void showDesc(){
System.out.println("我是一个可爱的人");
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", id=" + id +
'}';
}
}