Java實現反射的方式和反射的基本應用
阿新 • 來源:網路 • 發佈:2022-12-28
準備
先準備一個實體類User.java:
package com.example.reflect;
public class User {
private String id;
public String name;
private String telephone;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
}
獲取Class物件方式
反射第一步:獲取某個類的Class物件————有3種獲取方式
- 法1:Class<?> clazz = Class.forName(“完整類路徑”);
Class<?> clazz1 = Class.forName(“com.example.reflect.User”);
- 法2:Class<?> clazz = 類名.class;
Class<?> clazz2 = User.class;
- 法3:Class<?> clazz = 類的例項名.getClass();
User user = new User();
Class<?> clazz3 = user.getClass();
程式碼示例
接下來使用User實體類對反射實現方法進行演示:
package com.example.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
//===============反射第一步:獲取某個類的Class物件————有3種獲取方式
//********法1:Class<?> clazz = Class.forName("完整類路徑");
Class<?> clazz1 = Class.forName("com.example.reflect.User");
//********法2:Class<?> clazz = 類名.class;
Class<?> clazz2 = User.class;
//********法3:Class<?> clazz = 類的例項名.getClass();
User user = new User();
Class<?> clazz3 = user.getClass();
//===============獲取某個類的屬性(包含屬性的 修飾符、型別、屬性名 等資訊)
//*** 1.獲取所有屬性
Field[] fields = clazz1.getDeclaredFields();
//*** 2.獲取特定屬性名的欄位物件————方便對特定值重新賦值
Field nameField = clazz1.getField("name");
//獲取屬性的修飾符、型別、名稱
String attributeModifier = Modifier.toString(nameField.getModifiers());
Class<?> attributeType = nameField.getType();
String attributeName = nameField.getName();
//對name重新賦值——先建立例項物件,再賦值
User user1 = (User)clazz1.newInstance();
nameField.set(user1,"神樂");
//===============獲取某個類的方法(包含方法的 修飾符、返回型別、方法名 等資訊)
//*** 1.獲取所有方法
Method[] methods = clazz1.getDeclaredMethods();
//*** 2.獲取【特定方法名,特定引數型別】的方法物件————方便呼叫特定方法
Method setNameMethod = clazz1.getMethod("setName",String.class);
//呼叫特定方法——先建立例項物件,再呼叫方法
setNameMethod.invoke(user1,"新巴基");
}
}
