原文鏈接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提供反射來在運行時狀態下動態的獲取類的屬性、方法等資訊,在框架中很多地方都應用到了反射
反射的操作
獲取Class物件
獲取Class物件的四種方式
// 第一種
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/247969.html
標籤:其他
上一篇:《清單革命》讀書筆記
