反射_Class物件功能
獲取功能:
1. 獲取成員變數們
* Field[] getFields() :獲取所有public修飾的成員變數
* Field getField(String name) 獲取指定名稱的 public修飾的成員變數
* Field[] getDeclaredFields() 獲取所有的成員變數,不考慮修飾符
* Field getDeclaredField(String name)
2. 獲取構造方法們
* Constructor<?>[] getConstructors()
* Constructor<T> getConstructor(類<?>... parameterTypes)
* Constructor<T> getDeclaredConstructor(類<?>... parameterTypes)
* Constructor<?>[] getDeclaredConstructors()
3. 獲取成員方法們:
* Method[] getMethods()
* Method getMethod(String name, 類<?>... parameterTypes)
* Method[] getDeclaredMethods()
* Method getDeclaredMethod(String name, 類<?>... parameterTypes)
4. 獲取全類名
* String getName()
Field:成員變數
操作:
1. 設定值
* void set(Object obj, Object value)
2. 獲取值
* get(Object obj)
3. 忽略訪問許可權修飾符的安全檢查
* setAccessible(true):暴力反射
示例:
建立一個簡單的類Person
public class Person {
private String name;
private int age;
public String a;
protected String b;
String c;
private String d;
public Person() {
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", a='" + a + '\'' +
", b='" + b + '\'' +
", c='" + c + '\'' +
", d='" + d + '\'' +
'}';
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println("eat...");
}
public void eat(String food){
System.out.println("eat..." + food);
}
}
public class ReflectDemo02 {
public static void main(String[] args) throws Exception {
//0獲取Personde Class物件
Class personClass = Person.class;
/*
1. 獲取成員變數們
* Field[] getFields() :獲取所有public修飾的成員變數
* Field getField(String name) 獲取指定名稱的 public修飾的成員變數
* Field[] getDeclaredFields() 獲取所有的成員變數,不考慮修飾符
* Field getDeclaredField(String name)
*/
//Field[] getFields() :獲取所有public修飾的成員變數
Field[] fields = personClass.getFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("--------------------------");
//Field getField(String name) 獲取指定名稱的 public修飾的成員變數
Field a = personClass.getField("a");
//獲取成員變數a的值
Person p = new Person();
Object result = a.get(p);
System.out.println(result);
//設定a的值
a.set(p,"張三");
System.out.println(p);
System.out.println("===================");
//Field[] getDeclaredFields() 獲取所有的成員變數,不考慮修飾符
Field[] declaredFields = personClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
//Field getDeclaredField(String name)
Field d = personClass.getDeclaredField("d");
//忽略訪問許可權修飾符的安全檢查
d.setAccessible(true);//暴力反射
Object value2 = d.get(p);
System.out.println(value2);
}
}
程式演示:
Constructor:構造方法
建立物件:
T newInstance(Object… initargs)
* 如果使用空引數構造方法建立物件,操作可以簡化:
* Class物件的newInstance方法
示例:
public class ReflectDemo03 {
public static void main(String[] args) throws Exception {
//0獲取Personde Class物件
Class personClass = Person.class;
/*
2. 獲取構造方法們
* Constructor<?>[] getConstructors()
* Constructor<T> getConstructor(類<?>... parameterTypes)
* Constructor<T> getDeclaredConstructor(類<?>... parameterTypes)
* Constructor<?>[] getDeclaredConstructors()
*/
//Constructor<T> getConstructor(類<?>...parameterTypes)
Constructor constructor = personClass.getConstructor(String.class, int.class);
System.out.println(constructor);
//建立物件
Object person = constructor.newInstance("張三", 22);
System.out.println(person);
System.out.println("----------------");
Constructor constructor1 = personClass.getConstructor(String.class, int.class);
System.out.println(constructor1);
//建立物件
Object o = personClass.newInstance();
System.out.println(o);
}
}
程式演示:
Method:方法物件
執行方法:
Object invoke(Object obj, Object… args)
* 獲取方法名稱:
* String getName:獲取方法名
獲取全類名
* String getName()
示例:
public class ReflectDemo04 {
public static void main(String[] args) throws Exception {
//0獲取Personde Class物件
Class personClass = Person.class;
/*
3. 獲取成員方法們:
* Method[] getMethods()
* Method getMethod(String name, 類<?>... parameterTypes)
* Method[] getDeclaredMethods()
* Method getDeclaredMethod(String name, 類<?>... parameterTypes)
*/
//獲取指定名稱的方法
Method eat_meath = personClass.getMethod("eat");
Person p = new Person();
//執行方法
eat_meath.invoke(p);
Method eat_method2 = personClass.getMethod("eat", String.class);
//執行方法
eat_method2.invoke(p,"飯");
//獲取所有public 修飾的方法
Method[] methods = personClass.getMethods();
for (Method method : methods) {
System.out.println(method);
String name = method.getName();
System.out.println(name);
//method.setAccessible(true);
}
//獲取類名
String className = personClass.getName();
System.out.println(className);//domain.Person
}
}
程式演示:
相關文章
- 反射--Class物件功能--獲取Method反射物件
- java基礎:深入理解Class物件與反射機制Java物件反射
- JAVA之反射學習1-如何獲取Class物件Java反射物件
- java反射之Class類Java反射
- 從Class原始碼看反射原始碼反射
- Scala進階(1)—— 反射 object 和 class反射Object
- 物件導向 -- 反射物件反射
- Java Class物件簡介Java物件
- [Java基礎]Class物件Java物件
- Java SE之反射技術[Class,Field](一)Java反射
- java反射構建物件和方法的反射呼叫Java反射物件
- 00024.06 反射:反射的應用2:動態建立物件反射物件
- Spring 解耦反射建立物件Spring解耦反射物件
- 使用反射建立窗體物件時,物件為NULL反射物件Null
- PHP 物件導向 (十一)反射類PHP物件反射
- Python物件導向之九:反射Python物件反射
- 獲取 Class 物件的 3 種方法物件
- JavaScript 通過class獲取元素物件JavaScript物件
- JS 中的物件導向 prototype classJS物件
- web中,利用反射給物件賦值Web反射物件賦值
- es6 class進階【一個將class轉原型物件的例子】原型物件
- 14 Python物件導向程式設計:反射Python物件程式設計反射
- Java獲取Class物件的方式和例項化物件的方式Java物件
- Java中獲取Class物件的三種方式Java物件
- Java如何將Object轉換成指定Class物件JavaObject物件
- JavaScript物件導向—深入ES6的classJavaScript物件
- 通過反射獲取私有內部類物件反射物件
- 透過反射對比兩個物件是否相等反射物件
- ES6中的class物件和它的家人們物件
- 2.1.2 Python物件導向之反射以及內建方法Python物件反射
- 深入探究 Golang 反射:功能與原理及應用Golang反射
- 深入理解JS中的物件(三):class 的工作原理JS物件
- 05-v-bind動態繫結class(物件語法)物件
- Java 基於上傳的jar進行反射生成物件JavaJAR反射物件
- 反射獲取注入到spring中的類物件的工具類反射Spring物件
- 類例項物件的class型別卻不屬於該類,何解?物件型別
- iOS[super class]和[self class]iOS
- class