日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Java 反射 (快速了解反射)

發布時間:2023/11/27 生活经验 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 反射 (快速了解反射)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。