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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

什么是反射?反射的用法?实例说明。

發(fā)布時(shí)間:2025/3/19 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是反射?反射的用法?实例说明。 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

        • 什么是反射?
        • 具體方法介紹
          • getFields方法
          • getDeclaredFields方法
          • getMethods方法
          • getDeclaredMethods方法
          • invoke方法

什么是反射?

生物學(xué):反射是機(jī)體對(duì)內(nèi)在或外在刺激有規(guī)律的反映。
java反射:官方解釋是程序在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),都可以知道這個(gè)類(lèi)所有屬性和方法,對(duì)于任意一個(gè)對(duì)象都能夠調(diào)用他的任意方法和屬性。

具體方法介紹

首先定一個(gè)實(shí)體類(lèi)

package com.leo.demo.reflecttest;/*** @ClassName: UserInfo* @Description: 反射的測(cè)試實(shí)例* @Author: leo825* @Date: 2020-03-03 09:19* @Version: 1.0*/ public class UserInfo {//用戶(hù)idprivate String id;//用戶(hù)姓名private String name;//用戶(hù)性別private String gender;//用戶(hù)年齡private String age;//測(cè)試屬性1public String desc;//測(cè)試屬性2protected String desc2;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 getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}@Overridepublic String toString() {return "UserInfo{" +"id='" + id + '\'' +", name='" + name + '\'' +", gender='" + gender + '\'' +", age='" + age + '\'' +'}';}public String toJsonString() {return "UserInfo{" +"\"id\":\"" + id + '\"' +", \"name\":\"" + name + '\"' +", \"gender\":\"" + gender + '\"' +", \"age\":\"" + age + '\"' +'}';}//這是個(gè)私有方法private void privateMethodTest(){System.out.println("我是是個(gè)私有方法");} }

上面的實(shí)體類(lèi)非常簡(jiǎn)單,那我們就測(cè)試一下通過(guò)反射獲取屬性和方法
測(cè)試定義一個(gè)UserInfo對(duì)象,并賦值相關(guān)屬性

UserInfo userInfo = new UserInfo();userInfo.setId("1");userInfo.setName("zhangsan");userInfo.setGender("男");userInfo.setAge("30");System.out.println(userInfo.toString());System.out.println(userInfo.toJsonString());//獲取當(dāng)前對(duì)象的ClassClass clz = userInfo.getClass();
getFields方法

getFields方法是獲取當(dāng)前對(duì)象所有的public屬性

System.out.println("獲取當(dāng)前對(duì)象的屬性(public)");Field[] fields1 = clz.getFields();for (Field field : fields1) {System.out.println(field);}

測(cè)試結(jié)果

getFields獲取當(dāng)前對(duì)象的屬性(publicpublic java.lang.String com.leo.demo.reflecttest.UserInfo.desc
getDeclaredFields方法

getDeclaredFields獲取當(dāng)前對(duì)象的所有屬性(public、protected、private)

System.out.println("獲取當(dāng)前對(duì)象的屬性(public、protected、private)");Field[] fields2 = clz.getDeclaredFields();for (Field field : fields2) {System.out.println(field);}

測(cè)試結(jié)果

getDeclaredFields獲取當(dāng)前對(duì)象的屬性(public、protected、privateprivate java.lang.String com.leo.demo.reflecttest.UserInfo.id private java.lang.String com.leo.demo.reflecttest.UserInfo.name private java.lang.String com.leo.demo.reflecttest.UserInfo.gender private java.lang.String com.leo.demo.reflecttest.UserInfo.age public java.lang.String com.leo.demo.reflecttest.UserInfo.desc protected java.lang.String com.leo.demo.reflecttest.UserInfo.desc2
getMethods方法

getMethods獲取當(dāng)前對(duì)象的所有公有方法(不包含私有方法,包含從父類(lèi)繼承的方法)
測(cè)試代碼:

System.out.println("getMethods獲取當(dāng)前對(duì)象的所有公有方法(不包含私有方法,包含從父類(lèi)繼承的方法)");Method[] methods = clz.getMethods();for (Method method1 : methods) {System.out.println(method1);}

測(cè)試結(jié)果

getMethods獲取當(dāng)前對(duì)象的所有公有方法(不包含私有方法,包含從父類(lèi)繼承的方法) public java.lang.String com.leo.demo.reflecttest.UserInfo.toString() public java.lang.String com.leo.demo.reflecttest.UserInfo.getName() public java.lang.String com.leo.demo.reflecttest.UserInfo.getId() public void com.leo.demo.reflecttest.UserInfo.setName(java.lang.String) public void com.leo.demo.reflecttest.UserInfo.setGender(java.lang.String) public void com.leo.demo.reflecttest.UserInfo.setAge(java.lang.String) public java.lang.String com.leo.demo.reflecttest.UserInfo.toJsonString() public void com.leo.demo.reflecttest.UserInfo.setId(java.lang.String) public java.lang.String com.leo.demo.reflecttest.UserInfo.getGender() public java.lang.String com.leo.demo.reflecttest.UserInfo.getAge() public final void java.lang.Object.wait() throws java.lang.InterruptedException public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException public boolean java.lang.Object.equals(java.lang.Object) public native int java.lang.Object.hashCode() public final native java.lang.Class java.lang.Object.getClass() public final native void java.lang.Object.notify() public final native void java.lang.Object.notifyAll()
getDeclaredMethods方法

getDeclaredMethods獲取當(dāng)前對(duì)象的所有方法(包含私有方法,不包含父類(lèi)的方法)

System.out.println("getDeclaredMethods獲取當(dāng)前對(duì)象的所有方法(包含私有方法,不包含父類(lèi)的方法)");Method[] methods2 = clz.getDeclaredMethods();for (Method method2 : methods2) {System.out.println(method2);}

測(cè)試結(jié)果

getDeclaredMethods獲取當(dāng)前對(duì)象的所有方法(包含私有方法,不包含父類(lèi)的方法) public java.lang.String com.leo.demo.reflecttest.UserInfo.toString() public java.lang.String com.leo.demo.reflecttest.UserInfo.getName() public java.lang.String com.leo.demo.reflecttest.UserInfo.getId() public void com.leo.demo.reflecttest.UserInfo.setName(java.lang.String) private void com.leo.demo.reflecttest.UserInfo.privateMethodTest() public void com.leo.demo.reflecttest.UserInfo.setGender(java.lang.String) public void com.leo.demo.reflecttest.UserInfo.setAge(java.lang.String) public java.lang.String com.leo.demo.reflecttest.UserInfo.toJsonString() public void com.leo.demo.reflecttest.UserInfo.setId(java.lang.String) public java.lang.String com.leo.demo.reflecttest.UserInfo.getGender() public java.lang.String com.leo.demo.reflecttest.UserInfo.getAge()
invoke方法

通過(guò)反射方式執(zhí)行對(duì)象里面的方法:

System.out.println("invoke通過(guò)反射來(lái)執(zhí)行方法(重要)");Method invokMethod = clz.getDeclaredMethod("privateMethodTest", null);//私有方法執(zhí)行需要setAccessible=trueinvokMethod.setAccessible(true);invokMethod.invoke(userInfo, null);

執(zhí)行私有方法需加要setAccessible=true,如果不加的話(huà)會(huì)報(bào)如下錯(cuò):

Exception in thread "main" java.lang.IllegalAccessException: Class com.leo.demo.reflecttest.ReflectTest can not access a member of class com.leo.demo.reflecttest.UserInfo with modifiers "private"at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)at java.lang.reflect.Method.invoke(Method.java:490)at com.leo.demo.reflecttest.ReflectTest.main(ReflectTest.java:61)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:497)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

測(cè)試結(jié)果

invoke通過(guò)反射來(lái)執(zhí)行方法(重要) 我是是個(gè)私有方法

總結(jié)

以上是生活随笔為你收集整理的什么是反射?反射的用法?实例说明。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。