1. 程式人生 > >Java使用PropertyDescriptor獲取實體類中私有屬性的值,並給私有屬性賦值

Java使用PropertyDescriptor獲取實體類中私有屬性的值,並給私有屬性賦值

大家都知道Java類中的私有的(private)屬性是獲取不到的(即使使用繼承依然獲取不到),那如果非要獲取私有屬性的值怎麼辦呢?一般的做法是將該java類封裝稱為一個JavaBean,即封裝該私有屬性,提供一對共有的get,set方法來訪問私有屬性。一般情況下都會這樣做!但遇到特殊情況呢?比如,先現有一個需求:訪問一個Java類的私有屬性,並且該類不提供訪問該私有屬性的共有方法!下面就為大家介紹一種方法訪問java類的私有屬性。

要獲取java類的私有屬性就不得不先介紹一個類PropertyDescriptor。該類為屬性描述符類。通過該類提供的一系列方法來訪問java類中的私有屬性。

 下面看一段程式碼:

BeanUtils.java為:

package yw.javaben;


import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;


/**
 * 獲取私有屬性值JavaBean的幫助類
 * @author yw-tony
 *
 */
public class BeanUtils {
    private PropertyDescriptor dp = null;
    private String propertyName;
    private Object obj;
    /**
     * 構造方法
     * @param objName 屬性名稱
     * @param obj  要操作的物件
     */
    public BeanUtils(String objName,Object obj){
        try{
            this.propertyName = objName;
            this.obj = obj;
            dp = new PropertyDescriptor(propertyName, obj.getClass());
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    /**
     * 獲取javabean私有屬性的值
     * @return
     * @throws Exception
     */
    public Object getProperty() throws Exception {
        //獲取物件屬性方法
        Method method = dp.getReadMethod();
        //獲取屬性對應的值
        Object retValue = method.invoke(obj);
        
        return retValue;
    }
    /**
     * 設定私有屬性的值
     * @param setValue
     * @throws Exception
     */
    public void setProperty(Object setValue) throws Exception {
        Method method = dp.getWriteMethod();
        method.invoke(obj, setValue);
    }
    
    
}

BeanEntity.java為:
package yw.javaben;

/**
 * 驗證屬性識別符號的javabean
 * @author yw-tony
 *
 */
public class BeanEntity {
    private int x;
    private int y = 10;
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    

}


JavaBeanTest.java為:

public class JavaBeanTest {
    /**
     * 測試JavaBean
     * 
     * @param args
     */
    public static void main(String[] args) throws Exception {
        BeanEntity bean = new BeanEntity();
        String x = "x";//BeanEntity的屬性名稱
        BeanUtils utils = new BeanUtils(x, bean);
        utils.setProperty(12);
        Object value = utils.getProperty();
        System.out.println(value);

    }
}




相關推薦

Java使用PropertyDescriptor獲取實體私有屬性私有屬性

大家都知道Java類中的私有的(private)屬性是獲取不到的(即使使用繼承依然獲取不到),那如果非要獲取私有屬性的值怎麼辦呢?一般的做法是將該java類封裝稱為一個JavaBean,即封裝該私有屬性,提供一對共有的get,set方法來訪問私有屬性。一般情況下都會這樣做

Java使用PropertyDescriptor獲取實體私有屬性私有屬性

下面看一段程式碼:BeanUtils.javapackage yw.javaben; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; /** * 獲取私有屬性值JavaBean的幫助類 * @author y

利用反射獲取實體私有屬性

平時接並沒有怎麼接觸反射,今天遇到了,就記錄下來把 我的檔案結構 說明:1.Student.java是實體類,裡面是一些私有的屬性欄位     2.FanSheUtil.java是整個的核心類,     3.Demo.java 是測試類 步驟: 1.建立一個Studen

java獲取實體的get、set方法名

/** * java反射bean的get方法 * * @param objectClass * @param fieldName * @return */ @Suppr

java反射獲取字段的屬性以及為字段等方法

通過 獲取 首字母 color als 遍歷 方法 access col 1.獲取某個類的屬性值 1 /*利用getter方法獲取值(首字母大寫) 2 CjJssetDTO obj; 3 */ 4 String filed

C++的建構函式拷貝建構函式和函式

一.建構函式 1.首先說明一下空類: 對於空類,編譯器會自動加入: 預設建構函式,拷貝建構函式,賦值建構函式,解構函式和取值函式 擴充:空類的大小為1.(因為每個例項在記憶體中都有獨一無二的地址,為了達到這個目的,編譯器往往會給空類增加一個位元組) 2

獲取easyui-datagrid選中的資料遍歷得到目標資料

//id和title是我想要的資料 var docData = $('#grid').datagrid('getChecked'); var arr = new Array(); for(var

java跨方法傳遞物件引用變數對該變數引起的問題

關於物件引用做方法引數問題,在java中 基本型別變數做引數傳另外一個方法中重新賦值時,會重新在棧中複製一份,物件引用也是一樣,如 public methodA(){ int i = 0; method

linux查詢使用者狀態已鎖使用者解鎖

1、首先如果當前是root使用者,那麼先切換到oracle使用者,然後開啟sqlplus,並且賦予dba角色。 [[email protected] ~]$ sqlplus /nolog

ExtJs4gird列增加操作列操作按鈕繫結事件

在ExtJs4中,grid元件有Ext.grid.column.Action元件,所有要增加操作列,只需指定列的xtype為actioncolumn即可,例如: Ext.create('Ext.grid.Panel', { renderTo: Ext.getBody

在cell上新增長按手勢手勢新增tag

1、在cell上新增長按手勢; UILongPressGestureRecognizer *longPressGR = [[UILongPressGestureRecognizeralloc]

通過隨機數獲得學生成績把每個元素為學生的分數成績通過增強for循環遍歷結果。

() nbsp sco math i++ oid 學生 length pac package com.Summer_0419.cn; /** * @author Summer * 通過隨機數獲得學生成績,並把每個元素賦值為學生的分數成績 */ pub

C# 反射修改私有靜態成員變數 反射獲取修改屬性

//動態連結庫中ClsPublic類有一變數 private static string key="1111";//下面通過反射的技術修改和獲取值//設定key public static void updatePalmKey(string key = "t

java 獲取實體屬性

List<EntryVO> indexEntryList = service.getIndexEntryVOList(); List<EntryVO> personalList = new ArrayList<>();

spring aop 獲取攔截屬性

最近搭建一個ssh的通用架子時,想做個通用日誌的攔截方法,可以利用反射獲取攔截類中的屬性 不多說,上程式碼 日誌類 public class MyLog { public void doBefore(JoinPoint jp) throws SecurityExcepti

Java通過例項得到實體屬性屬性

方式一(實體類):1234567//java中遍歷實體類,獲取屬性名和屬性值public static void testReflect(Object model) throws Exception{for (Field field : model.getClass().ge

java實體會忽略的的問題

spa get pos val light 原因 blog 方法 什麽 在我們java Map中通過get來取值時會忽略的問題是:如果取得一個空值null時,那麽.toString()時就會出錯,而且不知道是什麽原因。 現在我給的具體方法是用條件表達式先判斷一下。 例:

resultMap自定義映射---8.3.1. 解決列名(表的字段名稱)和實體屬性名不一致

lec per 編寫 動態代理 參數類型 ID res HERE 用戶 1.1.1.1. 步驟一:將駝峰匹配註釋掉 --------------測試完成後仍然 回來開啟 其他地方可能用到 一旦註釋掉駝峰匹配,那麽再通過queryUserById查詢的結果中,用戶

freemarker獲取封裝物件的屬性

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

【java學習筆記】MyBatis實體屬性名和表的欄位名不一樣時的解決方法

在使用MyBatis開發DAO層時,當實體類中的屬性名和表中的欄位名不一樣時,查詢出來的值為null,此時有3種解決方法 解決方法1                在Mapper.xml對映檔案中,寫SQL語句時起別名 解決