什么是反射?反射的用法?实例说明。
生活随笔
收集整理的這篇文章主要介紹了
什么是反射?反射的用法?实例说明。
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 什么是反射?
- 具體方法介紹
- getFields方法
- getDeclaredFields方法
- getMethods方法
- getDeclaredMethods方法
- invoke方法
什么是反射?
生物學:反射是機體對內在或外在刺激有規律的反映。
java反射:官方解釋是程序在運行狀態中,對于任意一個類,都可以知道這個類所有屬性和方法,對于任意一個對象都能夠調用他的任意方法和屬性。
具體方法介紹
首先定一個實體類
package com.leo.demo.reflecttest;/*** @ClassName: UserInfo* @Description: 反射的測試實例* @Author: leo825* @Date: 2020-03-03 09:19* @Version: 1.0*/ public class UserInfo {//用戶idprivate String id;//用戶姓名private String name;//用戶性別private String gender;//用戶年齡private String age;//測試屬性1public String desc;//測試屬性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 + '\"' +'}';}//這是個私有方法private void privateMethodTest(){System.out.println("我是是個私有方法");} }上面的實體類非常簡單,那我們就測試一下通過反射獲取屬性和方法
測試定義一個UserInfo對象,并賦值相關屬性
getFields方法
getFields方法是獲取當前對象所有的public屬性
System.out.println("獲取當前對象的屬性(public)");Field[] fields1 = clz.getFields();for (Field field : fields1) {System.out.println(field);}測試結果
getFields獲取當前對象的屬性(public) public java.lang.String com.leo.demo.reflecttest.UserInfo.descgetDeclaredFields方法
getDeclaredFields獲取當前對象的所有屬性(public、protected、private)
System.out.println("獲取當前對象的屬性(public、protected、private)");Field[] fields2 = clz.getDeclaredFields();for (Field field : fields2) {System.out.println(field);}測試結果
getDeclaredFields獲取當前對象的屬性(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獲取當前對象的所有公有方法(不包含私有方法,包含從父類繼承的方法)
測試代碼:
測試結果
getMethods獲取當前對象的所有公有方法(不包含私有方法,包含從父類繼承的方法) 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獲取當前對象的所有方法(包含私有方法,不包含父類的方法)
System.out.println("getDeclaredMethods獲取當前對象的所有方法(包含私有方法,不包含父類的方法)");Method[] methods2 = clz.getDeclaredMethods();for (Method method2 : methods2) {System.out.println(method2);}測試結果
getDeclaredMethods獲取當前對象的所有方法(包含私有方法,不包含父類的方法) 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方法
通過反射方式執行對象里面的方法:
System.out.println("invoke通過反射來執行方法(重要)");Method invokMethod = clz.getDeclaredMethod("privateMethodTest", null);//私有方法執行需要setAccessible=trueinvokMethod.setAccessible(true);invokMethod.invoke(userInfo, null);執行私有方法需加要setAccessible=true,如果不加的話會報如下錯:
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)測試結果
invoke通過反射來執行方法(重要) 我是是個私有方法總結
以上是生活随笔為你收集整理的什么是反射?反射的用法?实例说明。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 遍历Map的几种方式以及性能小结
- 下一篇: java面向对象三大特性:封装、继承、多