生活随笔
收集整理的這篇文章主要介紹了
反射常用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的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。