Java 反射 (快速了解反射)
生活随笔
收集整理的這篇文章主要介紹了
Java 反射 (快速了解反射)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
反射的概念
JAVA反射機制是在運行狀態中,對于任意一個實體類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱為java語言的反射機制
Java反射有三個動態性質:
1、運行時生成對象實例
2、運行期間調用方法
3、運行時更改屬性
通過這些動態性質,JAVA反射可以在程序運行時獲取對象和類的真實信息。
Java反射可以實現的功能:
1、在運行時判斷任意一個對象所屬的類
2、在運行時構造任意一個類的對象
3、在運行時判斷任意一個類所具有的方法和屬性
4、在運行時調用任意一個對象的方法
5、生成動態代理
?
與Java反射相關的類如下:
| 類名 | 用途 |
|---|---|
| Class類 | 代表類的實體,在運行的Java應用程序中表示類和接口 |
| Field類 | 代表類的成員變量(成員變量也稱為類的屬性) |
| Method類 | 代表類的方法 |
| Constructor類 | 代表類的構造方法 |
?
Class類
?
?
假如現在有一個私有的student 方法 想調用這個方法就可以使用反射
一個student 類如下
public class Student {private String name;private int age;private Student(String name, int age) {this.name = name;this.age = age;}public Student(){throw new IllegalAccessError("就不給你創建");}private String getName() {return name == null ? "" : name;}private void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
?
實現如下
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Fine{public static void main(String[] args){Class<?> clz = null;try {clz = Class.forName("Student");} catch (ClassNotFoundException e) {e.printStackTrace();}// 找到帶有這個參數的構造方法Constructor constructor = null;try {constructor = clz.getDeclaredConstructor(String.class, int.class);} catch (NoSuchMethodException e) {e.printStackTrace();}constructor.setAccessible(true);// 初始化對象Object student = null;try {student = constructor.newInstance("張三", 18);} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {e.printStackTrace();}System.out.println("--------------"+constructor.toString());// 找到該私有方法Method getName = null;try {getName = clz.getDeclaredMethod("getName");} catch (NoSuchMethodException e) {e.printStackTrace();}getName.setAccessible(true);String name = null;try {name = (String) getName.invoke(student);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}System.out.println("--------------"+name);// 找到私有屬性Field age = null;try {age = clz.getDeclaredField("age");} catch (NoSuchFieldException e) {e.printStackTrace();}age.setAccessible(true);try {age.setInt(student, 20); // 修改屬性} catch (IllegalAccessException e) {e.printStackTrace();}try {System.out.println("--------------"+age.get(student));} catch (IllegalAccessException e) {e.printStackTrace();}}
}
輸出結果:
總結
以上是生活随笔為你收集整理的Java 反射 (快速了解反射)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一部神话电影,好像是古希腊的神话电影。
- 下一篇: 红楼梦谁写的作者是谁啊?