Java讀書筆記十一(Java中的內省機制)
阿新 • • 發佈:2018-12-25
1.前言
最近在學習Java的時候,突然發現了這個概念,鑑於好奇心的壓迫,於是打算寫一篇部落格來總結一下。
2.什麼是內省機制
為了讓程式設計師們更好的從左Java物件的屬性,SUN公司開發了一套API,就被我們稱為“內省”,有利於我們對類物件的屬性的操作,減少了程式碼的數量。
3.內省和反射有什麼區別
反射式在執行狀態把Java類中的各種成分對映成相應的Java類,可以動態的獲取所有的屬性以及動態呼叫任意一個方法,強調的是執行狀態。
內省機制是通過反射來實現的,BeanInfo用來暴露一個bean的屬性、方法和事件,以後我們就可以操縱該JavaBean的屬性
4.一張圖總結
在Java內省中,用到的基本上就是上述幾個類。
通過BeanInfo這個類就可以獲取到類中的方法和屬性,具體的可以參考JDK文件
5.Demo展示
5.1.通過PropertyDescriptor修改屬性方式
- package com.query;
- import java.beans.PropertyDescriptor;
- import java.lang.reflect.Method;
- publicclass BeanInfoUtil {
- publicstaticvoid setProperty(UserInfo userInfo,String userName)throws Exception{
- PropertyDescriptor propDesc=new
PropertyDescriptor(userName,UserInfo.class);- Method methodSetUserName=propDesc.getWriteMethod();
- methodSetUserName.invoke(userInfo, "wong");
- System.out.println("set userName:"+userInfo.getUserName());
- }
- publicstaticvoid getProperty(UserInfo userInfo,String userName)
throws Exception{- PropertyDescriptor proDescriptor =new PropertyDescriptor(userName,UserInfo.class);
- Method methodGetUserName=proDescriptor.getReadMethod();
- Object objUserName=methodGetUserName.invoke(userInfo);
- System.out.println("get userName:"+objUserName.toString());
- }
- }
5.2.通過Introspector類修改屬性
- package com.query;
- import java.beans.BeanInfo;
- import java.beans.Introspector;
- import java.beans.PropertyDescriptor;
- import java.lang.reflect.Method;
- publicclass BeanInfoUtil2 {
- publicstaticvoid setPropertyByIntrospector(UserInfo userInfo,
- String userName) throws Exception {
- BeanInfo beanInfo = Introspector.getBeanInfo(UserInfo.class);
- PropertyDescriptor[] proDescrtptors = beanInfo.getPropertyDescriptors();
- if (proDescrtptors != null && proDescrtptors.length > 0) {
- for (PropertyDescriptor propDesc : proDescrtptors) {
- if (propDesc.getName().equals(userName)) {
- Method methodSetUserName = propDesc.getWriteMethod();
- methodSetUserName.invoke(userInfo, "alan");
- System.out
- .println("set userName:" + userInfo.getUserName());
- break;
- }
- }
- }
- }
- publicstaticvoid getPropertyByIntrospector(UserInfo userInfo,
- String userName) throws Exception {
- BeanInfo beanInfo = Introspector.getBeanInfo(UserInfo.class);
- PropertyDescriptor[] proDescrtptors = beanInfo.getPropertyDescriptors();
- if (proDescrtptors != null && proDescrtptors.length > 0) {
- for (PropertyDescriptor propDesc : proDescrtptors) {
- if (propDesc.getName().equals(userName)) {
- Method methodGetUserName = propDesc.getReadMethod();
- Object objUserName = methodGetUserName.invoke(userInfo);
- System.out
- .println("get userName:" + objUserName.toString());
- break;
- }
- }
- }
- }
- }
注意事項,在上述修改JavaBean屬性的時候,如果資料型別不對的話,會報錯。例如BeanInfoUtil.setProperty(userInfo, "age");報錯是應為age屬性是int資料型別,而setProperty方法裡面預設給age屬性賦的值是String型別。所以會爆出argument type mismatch引數型別不匹配的錯誤資訊。