反射

原文連接http://zhhll.icu/2020/08/17/java%E5%9F%BA%E7%A1%80/%E5%8F%8D%E5%B0%84/%E5%8F%8D%E5%B0%84/java

反射

Java提供反射來在運行時狀態下動態的獲取類的屬性、方法等信息,在框架中不少地方都應用到了反射框架

反射的操做

獲取Class對象

獲取Class對象的四種方式code

// 第一種
Class<Person> clazz = Person.class;

// 第二種
Person person = new Person();
Class clazz1 =  person.getClass();

// 第三種
String className = "com.zhanghe.study.reflect.Person";
Class clazz2 = Class.forName(className);

// 第四種 使用類加載器
ClassLoader classLoader = TestClass.class.getClassLoader();
Class clazz3 = classLoader.loadClass(className);

獲取構造器

Class clazz = TestConstructor.class;
Constructor[] constructors = clazz.getConstructors();
System.out.println("=========clazz.getConstructors()====只能獲取到公有的構造器");
for(Constructor constructor : constructors){
  System.out.println(constructor);
}
System.out.println("*****************");

System.out.println("=========clazz.getConstructor()=====獲取公有無參構造器");
Constructor constructor = clazz.getConstructor();
System.out.println(constructor);
System.out.println("*****************");

System.out.println("=========clazz.getDeclaredConstructors()=====獲取全部構造器(包括私有、受保護、默認、公有)");
Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
for(Constructor declaredConstructor : declaredConstructors){
  System.out.println(declaredConstructor);
}
System.out.println("*****************");

System.out.println("=========clazz.getDeclaredConstructor()====獲取指定參數類型的構造器");
Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class);
System.out.println(declaredConstructor);
System.out.println("*****************");

獲取屬性

System.out.println("======getFields===========");
// 獲取全部的屬性  只能獲取到該類和父類中public的
Field[] fields = clazz.getFields();
for (Field f : fields){
  System.out.println(f.getName());
}
System.out.println("======getDeclaredFields===========");
// 獲取全部的屬性  本類中聲明的全部的屬性均可以獲取到,不能夠獲取到父類的
Field[] declaredFields = clazz.getDeclaredFields();
for (Field f : declaredFields){
  // 獲取權限修飾符
  int i = f.getModifiers();
  String m = Modifier.toString(i);
  System.out.println("Modifier:"+m);
  // 獲取屬性類型
  Class type = f.getType();
  System.out.println("type:"+type.getTypeName());
  // 獲取屬性名
  System.out.println("name:"+f.getName());
}

獲取方法

System.out.println("======getMethods===========");
// 獲取本類和父類中全部的public方法
Method[] methods = clazz.getMethods();
for(Method m : methods){
  System.out.println(m.getName());
}

System.out.println("======getDeclaredMethods===========");
// 獲取本類中全部的方法,包括私有方法  父類的沒法獲取
Method[] declaredMethods = clazz.getDeclaredMethods();
for(Method m : declaredMethods){
  // 獲取註解
  Annotation[] annotations = m.getAnnotations();
  // 權限修飾符
  System.out.println("Modifier:"+Modifier.toString(m.getModifiers()));
  // 返回值類型
  Class reture = m.getReturnType();
  // 形參列表
  Class[] params = m.getParameterTypes();
  // 方法名
  System.out.println(m.getName());
  // 異常類型
  Class[] exceptions = m.getExceptionTypes();
}

獲取父類信息

// 獲取父類
Class superClass = clazz.getSuperclass();

// 獲取帶泛型的父類
Type superType = clazz.getGenericSuperclass();

// 獲取父類的泛型
if(superType instanceof ParameterizedType){ // 若是存在泛型
  Type[] actualTypeArguments = ((ParameterizedType) superType).getActualTypeArguments();
}

獲取接口

// 獲取實現的接口
Class[] interfaces  = clazz.getInterfaces();

獲取包

// 獲取所在的包
Package aPackage = clazz.getPackage();

獲取註解

// 獲取註解
Annotation[] annotations  = clazz.getAnnotations();

反射爲屬性賦值

// 經過反射建立person實例
Person person = clazz.newInstance();
// 經過反射獲取類的age屬性,並賦值
Field field = clazz.getDeclaredField("age");
field.setAccessible(true);
field.set(person,20);

反射執行方法

// 經過反射獲取方法,並調用
Method method = clazz.getMethod("display");
method.invoke(person);

因爲自己的博客百度沒有收錄,博客地址http://zhhll.icu對象

相關文章
相關標籤/搜索