什么是反射?反射的用法?实例说明。
文章目錄
- 什么是反射?
- 具體方法介紹
- 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)屬性
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ì)象的屬性(public) public java.lang.String com.leo.demo.reflecttest.UserInfo.descgetDeclaredFields方法
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、private) private 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.desc2getMethods方法
getMethods獲取當(dāng)前對(duì)象的所有公有方法(不包含私有方法,包含從父類(lèi)繼承的方法)
測(cè)試代碼:
測(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)題。
- 上一篇: 遍历Map的几种方式以及性能小结
- 下一篇: java面向对象三大特性:封装、继承、多