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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

反射常用API

發布時間:2025/4/5 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 反射常用API 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

反射所有功能都是通過class API來實現的

?

class常用API有:

1。class.GETINTERFACES();獲得這個類實現的接口。

2。class。getMethods()

?

Method常用反射API

1.Method.invoke(),方法自己調用自己,方法調用必須通過object.method()方式,method對象本身是無法調用自己的。

2.Method.getParameterTypes()獲得參數類型

3.Method.getReturnType()獲得返回值類型

4.Method.getParameterCount()獲得方法的參數個數

5.Method.getName()獲得方法名稱

6.Method.getExceptionTypes()獲得方法拋出哪些異常

7.method.getAnnotation()獲得注解

?

Field常用反射API

1.field.getAnnotations()返回屬性的注解

?

通過反射可以獲得屬性Field。

1、定義一個實體類

[java]?view plaincopy print?
  • package?cn.com.refelct;??
  • ??
  • public?class?Emp?{??
  • ??
  • ????private?int?no;??
  • ????private?int?age;??
  • ????public?String?address;??
  • ????public?String?name;??
  • ??????
  • ????public?Emp(int?no,?int?age,?String?address,?String?name)?{??
  • ????????super();??
  • ????????this.no?=?no;??
  • ????????this.age?=?age;??
  • ????????this.address?=?address;??
  • ????????this.name?=?name;??
  • ????}??
  • ??????
  • }??
  • ?

    ?

    2、獲取Field

    ?

    [java]?view plaincopy print?
  • Field[]?publicFields?=?emp.getClass().getFields();??
  • ????for(Field?field:publicFields){??
  • ????????System.out.println(field);??
  • ????}??
  • 上述方式得到的結果如下:

    ?

    ?

    [java]?view plaincopy print?
  • public?java.lang.String?cn.com.refelct.Emp.address??
  • public?java.lang.String?cn.com.refelct.Emp.name??
  • 可見:該種方式只能得到public屬性的字段。

    ?

    ?

    為了得到所有的Field,見如下代碼:

    [java]?view plaincopy print?
  • Field[]?privateAndPublicFields?=?emp.getClass().getDeclaredFields();??
  • ????????for(Field?field:privateAndPublicFields){??
  • ????????????System.out.println(field);??
  • ????????}??
  • 上述方式得到的結果如下:

    ?

    ?

    [java]?view plaincopy print?
  • private?int?cn.com.refelct.Emp.no??
  • private?int?cn.com.refelct.Emp.age??
  • public?java.lang.String?cn.com.refelct.Emp.address??
  • public?java.lang.String?cn.com.refelct.Emp.name??

  • 3、獲取Field的值

    ?

    通過Filed,可以獲取對應的值:

    (1)獲取某個public屬性的值

    ?

    [java]?view plaincopy print?
  • Field?nameField?=?emp.getClass().getField("name");??
  • System.out.println("name的值:"?+?nameField.get(emp));??
  • 得到的結果如下:

    ?

    ?

    [java]?view plaincopy print?
  • name的值:yy??

  • (2)獲取某個private屬性的值

    ?

    ?

    [java]?view plaincopy print?
  • Field?ageField?=?emp.getClass().getDeclaredField("age");??
  • System.out.println("age的值:"?+?ageField.get(emp));??
  • 結果如下:

    ?

    ?

    [java]?view plaincopy print?
  • Exception?in?thread?"main"?java.lang.IllegalAccessException:?Class?cn.com.refelct.ReflectField?can?not?access?a?member?of?class?cn.com.refelct.Emp?with?modifiers?"private"??
  • ????at?sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)??
  • ????at?java.lang.reflect.Field.doSecurityCheck(Field.java:960)??
  • ????at?java.lang.reflect.Field.getFieldAccessor(Field.java:896)??
  • ????at?java.lang.reflect.Field.get(Field.java:358)??
  • <span?style="white-space:pre">????</span>at?cn.com.refelct.ReflectField.main(ReflectField.java:44)??
  • 可見:對于private的屬性,訪問不了。

    ?

    ? ? ? ? ? 做如下修改:

    ?

    [java]?view plaincopy print?
  • Field?ageField?=?emp.getClass().getDeclaredField("age");??
  • ageField.setAccessible(true);??
  • System.out.println("age的值:"?+?ageField.get(emp));??
  • 通過暴力反射的方式進行值的獲取。

    ?

    結果如下:

    ?

    [java]?view plaincopy print?
  • age的值:25??


  • 另外:對于static字段,當獲取其值時,傳入的對象為null或者任何一個實體類的對象。

    總結

    以上是生活随笔為你收集整理的反射常用API的全部內容,希望文章能夠幫你解決所遇到的問題。

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