黑马程序员技术交流社区

标题: BeansUtils工具类的操作细节 [打印本页]

作者: 李敬卫    时间: 2013-1-22 20:23
标题: BeansUtils工具类的操作细节
public class ReflectPoint2 {
private int x;
private int y;
private Date birthday=new Date();
public ReflectPoint2(int x, int y) {
super();
this.x = x;
this.y = y;
}
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;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public static void main(String[] args) throws Exception {

  ReflectPoint2 rp=new ReflectPoint2(3,6);
  


BeanUtils.setProperty(rp, "birthday.time", "2013");//如果此时不创建Date birthday=new Date()会报出空指针异常
System.out.println(BeanUtils.getProperty(rp,"birthday.time"));

PropertyUtils.setProperty(rp, "birthday.time",87878);
System.out.println(PropertyUtils.getProperty(rp,"birthday.time"));
System.out.println(PropertyUtils.getProperty(rp, "birthday.time").getClass().getName());
  
}
}
张老师说:BeanUtils.setProperty(rp, "y", 9);属性值要用"9"这样写,但是我测试了一下,直接写上一个数字9也能通过编译并运行。为什么不创建Date birthday=new Date(),就不能设置time的属性值?

作者: 黄锦成    时间: 2013-1-22 20:51
BeanUtils,它会帮你自动类型转换
PropertyUtils,值的类型要与属性类型对应
birthday是类的属性。其实BeanUtils调用了birthday的方法来赋值的。你对象都不存在,就调用birthday的方法,就出错了
作者: ︶ㄣ布丁    时间: 2013-1-22 21:16
测试程序:

[cpp] view plaincopy
// prjLanguageResource.cpp : Defines the entry point for the console application.  
//  
  
#include "stdafx.h"  
#include <tchar.h>  
#include "Helper/Language/LanguageResHelper.h"  
#include "Helper/file/fileHelper.h"  
#include "Helper/string/stringHelper.h"  
  
int _tmain(int argc, TCHAR * argv[])  
{  
    std::wstring    strRes;  
    std::wstring    strLangResPathName;  
  
    InitCmdlineDisp();  
  
    strLangResPathName = GetTheModulePath();  
    strLangResPathName += L"LangRes.ini";  
    CLanguageRes    LangRes((wchar_t *)strLangResPathName.c_str());  
  
    /// 建立多语言条目, 建立完成后,以后可以手工在语言文件中添加, 或做个语言文件录入程序  
  
    /// 制作中文资源  
//     LangRes.LangResSaveString(L"RESID_STR_PROG_NAME", L"中文测试程序", MAKELANGID(LANG_CHINESE_SIMPLIFIED, SUBLANG_CHINESE_SIMPLIFIED));  
  
    /// 制作英文资源  
//     LangRes.LangResSaveString(L"RESID_STR_PROG_NAME", L"test program by english", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));  
  
    /// 制作其他语种资源  
  
    /// 得到资源字符串  
    strRes = LangRes.LangResLoadString(L"RESID_STR_PROG_NAME");  
    _tprintf(L"[RESID_STR_PROG_NAME] = %s\r\n", strRes.c_str());  
  
    /// 使用资源字符串  
    ::SetWindowText(GetConsoleWindow(), strRes.c_str());  
  
    getchar();  
    return 0;  
}  

国际化资源操作类:
[cpp] view plaincopy
/// @file       Helper\Language\LanguageResConst.h  
/// @brief      多语言的常量定义  
#ifndef __HELPER_LANGUAGE_LANGUAGERESCONST_H__  
#define __HELPER_LANGUAGE_LANGUAGERESCONST_H__  
  
#pragma pack(1)  
  
#define LEN_LANGUAGE_RES_VALUE  4096  
#define STR_LANG_RES_FILE_NAME  L"LangRes.ini"  
#define STR_APPNAME_LANGUAGE_ID L"LANGUAGE_ID"  
  
typedef struct _tag_LanguageId  
{  
    DWORD   wPrimLangId;    ///< Prim. lang. symbol  
    DWORD   wSubLangId;    ///< Sublang. symbol  
  
    _tag_LanguageId()  
    {  
        this->wPrimLangId = 0;  
        this->wSubLangId = 0;  
    }  
  
    _tag_LanguageId(WORD wPrimLangId, WORD wSubLangId)  
    {  
        this->wPrimLangId = wPrimLangId;  
        this->wSubLangId = wSubLangId;  
    }  
}TAG_LANGUAGE_ID;  
  
#pragma pack()  
  
const TAG_LANGUAGE_ID g_arrLanguageId[] =   
{  
    TAG_LANGUAGE_ID(LANG_CHINESE_SIMPLIFIED,SUBLANG_CHINESE_SIMPLIFIED),    ///< 简体中文  
    TAG_LANGUAGE_ID(LANG_ENGLISH, SUBLANG_ENGLISH_US),                      ///< 英文  
};  
  
#endif  // #ifndef __HELPER_LANGUAGE_LANGUAGERESCONST_H__  

[cpp] view plaincopy
/// @file       \Helper\Language\LanguageResHelper.h  
/// @brief      多语言资源工具类   
  
#ifndef __HELPER_LANGUAGE_LANGUAGE_RES_HELPER_H__  
#define __HELPER_LANGUAGE_LANGUAGE_RES_HELPER_H__  
  
#include <string>  
#include "Helper/Language/LanguageResConst.h"  
#include "Helper/UnicodeIni/UnicodeIni.h"  
  
class CLanguageRes  
{  
public:  
    CLanguageRes();  
    CLanguageRes(wchar_t * pcLangResFilePathName);  
    virtual ~CLanguageRes();  
  
    /// 取资源串  
    std::wstring LangResLoadString(const wchar_t * pcLangResId);  
  
    /// 制作资源串  
    bool LangResSaveString(const wchar_t * pcLangResId, wchar_t * pcResValue, DWORD dwLangId);  
    std::wstring GetLanguageSectionById(DWORD dwLangId);   ///< 得到语言ID对应的Ini文件节名  
  
private:  
    void DataInit();    ///< 数据初始化  
    void DataUnInit();  ///< 数据反初始化  
    bool FindLocalLanguageId(DWORD & dwLocalLanguageId);    ///< 查找本地语言ID  
  
private:  
    bool            m_bFindLocalLanguageRes;    ///< 找到本地语言资源  
    DWORD           m_dwLanguageId;             ///< 本地语言ID  
    std::wstring    m_strLocalLanguageSection;  ///< 本地语言节, 都从这个节中读取资源串  
    CUnicodeIni *   m_pIniOpt;                  ///< UnicodeIni文件操作类  
};  
  
#endif  ///< #ifndef __HELPER_LANGUAGE_LANGUAGE_RES_HELPER_H__  

[cpp] view plaincopy
/// @file       LanguageResHelper.cpp  
/// @brief      请参考LanguageResHelper.h  
  
#include "stdafx.h"  
#include "Helper/Language/LanguageResHelper.h"  
#include "Helper/UnicodeIni/UnicodeIni.h"  
#include "Helper/string/stringHelper.h"  
  
CLanguageRes::CLanguageRes()  
{  
    DataInit();  
}  
  
CLanguageRes::CLanguageRes(wchar_t * pcLangResFilePathName)  
{  
    DataInit();  
  
    if (NULL != pcLangResFilePathName)  
    {  
        SAFE_DELETE(m_pIniOpt);  
        m_pIniOpt = new CUnicodeIni(pcLangResFilePathName, TRUE);  
    }  
}  
  
CLanguageRes::~CLanguageRes()  
{  
    DataUnInit();  
}  
  
std::wstring CLanguageRes::GetLanguageSectionById(DWORD dwLangId)  
{  
    return stringFormatW(L"%s0x%x", STR_APPNAME_LANGUAGE_ID, dwLangId);  
}  
  
void CLanguageRes::DataInit()  
{  
    m_bFindLocalLanguageRes = FindLocalLanguageId(m_dwLanguageId);  
    m_strLocalLanguageSection = GetLanguageSectionById(m_dwLanguageId);  
    m_pIniOpt = new CUnicodeIni(STR_LANG_RES_FILE_NAME, TRUE);  
}  
  
void CLanguageRes::DataUnInit()  
{  
    SAFE_DELETE(m_pIniOpt);  
}  
  
bool CLanguageRes::FindLocalLanguageId(DWORD & dwLocalLanguageId)  
{  
    bool    bFind               =   false;  
    size_t  nSize               =   sizeof(g_arrLanguageId) / sizeof(TAG_LANGUAGE_ID);  
    size_t  nIndex              =   0;  
    DWORD   dwLocalDefaultId    =   GetUserDefaultUILanguage();  
    DWORD   dwLanguageId        =   0;  
  
    dwLocalLanguageId = -1;  
    for (nIndex = 0; nIndex < nSize; nIndex++)  
    {  
        dwLanguageId = static_cast<DWORD>(MAKELANGID(g_arrLanguageId[nIndex].wPrimLangId, g_arrLanguageId[nIndex].wSubLangId));  
        if (dwLocalDefaultId == dwLanguageId)  
        {  
            bFind = true;  
            dwLocalLanguageId = dwLocalDefaultId;  
            break;  
        }  
    }  
  
    return bFind;  
}  
  
std::wstring CLanguageRes::LangResLoadString(const wchar_t * pcLangResId)  
{  
    WORD            wLangId =   0;  
    std::wstring    strRes  =   L"";    ///< 资源本地化串  
  
    if (m_bFindLocalLanguageRes)  
    {  
        strRes.resize(LEN_LANGUAGE_RES_VALUE);  
        m_pIniOpt->GetProfileString(m_strLocalLanguageSection.c_str(), pcLangResId, pcLangResId, (wchar_t *)(strRes.c_str()), LEN_LANGUAGE_RES_VALUE);  
    }  
    else   
        strRes = pcLangResId;  
  
    return strRes;  
}  
  
bool CLanguageRes::LangResSaveString(const wchar_t * pcLangResId, wchar_t * pcResValue, DWORD dwLangId)  
{  
    std::wstring strLanguageSection  =   GetLanguageSectionById(dwLangId);  
    return (m_pIniOpt->WriteProfileString(strLanguageSection.c_str(), pcLangResId, pcResValue)) ? true : false;  
}  




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2