Java學習:反射
反射
使用反射可以直接獲取class
位元組碼檔案中的型別、屬性、方法。
演示程式碼:
新建一個名為User
的類作為反射的操作物件
public class User {
private int id;
private String name;
private String password;
public User() {
}
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @param password the password to set
*/
public void setPassword(String password) {
this.password = password;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password + "]";
}
}
演示
類
獲取類
Object u = new User();
Class class1 = u.getClass();
獲取類名
class1.getName()
獲取類訪問許可權
int modifier = class1.getModifiers();
boolean flag = Modifier.isPublic(modifier);
System.out.println("是public?: "+flag);
屬性
獲取類所有屬性
訪問許可權私有的也可以獲取到
Field[] arr = class1.getDeclaredFields();
for (Field field:arr) {
System.out.println ("類中的屬性:" + field);
}
獲取類所有屬性的值
私有屬性預設無法獲取,但是可以通過不檢查訪問許可權來直接獲取。
// 獲取所有屬性的值
for (Field field:arr) {
// 不檢查訪問許可權
field.setAccessible(true);
// 獲取u物件中field的值
Object o = field.get(u);
System.out.println("類中的屬性值:" +o);
}
指定屬性名獲取屬性
Field f = class1.getDeclaredField("name");
f.setAccessible(true);
f.set(u, "張三");
Object o = f.get(u);
System.out.println("name: " + o);
方法
獲取所有方法(包含從父類繼承的方法)
Method[] allMethods = class1.getMethods();
System.out.println("類的所有方法:");
for (Method method:allMethods) {
System.out.println(method);
}
獲取類自己的方法
Method[] onlyMethods = class1.getDeclaredMethods();
for (Method method:onlyMethods) {
System.out.println(method);
}
呼叫無參帶返回值方法
Method method2 = class1.getDeclaredMethod("getName");
String str = (String)(method2.invoke(u));
System.out.println ("返回值:"+ str);
呼叫有參無返回值方法
Method method = class1.getDeclaredMethod("setName", String.class);
method.invoke(u, "李四");
完整演示程式碼:
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class ReflectTest {
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, InvocationTargetException {
Object u = new User();
// 獲取到User的類
Class class1 = u.getClass();
System.out.println("類名:"+class1.getName());
// 獲取類訪問許可權
int modifier = class1.getModifiers();
boolean flag = Modifier.isPublic(modifier);
System.out.println("是public?: "+flag);
// 獲取所有屬性
Field[] arr = class1.getDeclaredFields();
for (Field field:arr) {
System.out.println ("類中的屬性:" + field);
}
// 獲取所有屬性的值
for (Field field:arr) {
// 不檢查訪問許可權
field.setAccessible(true);
// 獲取u物件中field的值
Object o = field.get(u);
System.out.println("類中的屬性值:" +o);
}
// 指定欄位名稱獲取屬性
Field f = class1.getDeclaredField("name");
f.setAccessible(true);
f.set(u, "張三");
Object o = f.get(u);
System.out.println("name: " + o);
// 獲取所有方法 (包含繼承方法)
Method[] allMethods = class1.getMethods();
System.out.println("類的所有方法:");
for (Method method:allMethods) {
System.out.println(method);
}
// 獲取當前類的自己的方法
Method[] onlyMethods = class1.getDeclaredMethods();
for (Method method:onlyMethods) {
System.out.println(method);
}
// 呼叫有參方法
Method method = class1.getDeclaredMethod("setName", String.class);
method.invoke(u, "李四");
// 呼叫無參有返回值方法
Method method2 = class1.getDeclaredMethod("getName");
String str = (String)(method2.invoke(u));
System.out.println ("返回值:"+ str);
}
}
相關文章
- 【Java 反射學習】Java 反射基礎Java反射
- [Java 反射學習] Java 反射基礎Java反射
- Java學習_反射Java反射
- java反射學習(一)Java反射
- Java學習之反射篇Java反射
- Java學習筆記系列-反射Java筆記反射
- JAVA基礎學習篇之反射Java反射
- java反射機制的學習心得Java反射
- JAVA核心技術學習筆記--反射Java筆記反射
- Java註解與反射學習筆記Java反射筆記
- java反射之動態代理學習筆記Java反射筆記
- .Net 反射學習反射
- Java學習:反射的應用,依賴載入Java反射
- JAVA之反射學習3-反射獲取成員變數並賦值Java反射變數賦值
- JAVA之反射學習1-如何獲取Class物件Java反射物件
- JAVA之反射學習2-獲取構造方法並使用Java反射構造方法
- C# 反射/對映學習C#反射
- Java 反射Java反射
- Java——反射Java反射
- Java反射Java反射
- Java學習十七—反射機制:解鎖程式碼的無限可能Java反射
- Java反射—初探反射基礎Java反射
- 註解和反射學習筆記反射筆記
- Java 反射 APIJava反射API
- Java 反射原理Java反射
- Java的反射Java反射
- 20201209——java反射Java反射
- 淺析Java反射--JavaJava反射
- java學習之道 --- 如何學習java?Java
- Java筆記-Java反射(二)Java筆記反射
- Java基礎系列—Java反射Java反射
- python學習 day018打卡 反射Python反射
- Java 反射基礎Java反射
- Java反射-註解Java反射
- Java反射-屬性Java反射
- Java反射-模組Java反射
- Java 反射詳解Java反射
- 秒懂Java反射Java反射