1. 程式人生 > >利用java 反射原理寫了一個賦值和取值通用類

利用java 反射原理寫了一個賦值和取值通用類

      首先了解一下反射的原理,什麼是反射?所謂的反射就是指java 語言在執行時擁有一項自觀的能力,反射能使你得到裝載到 jvm 中的類的內部資訊,它不需要你在編碼的時候就知道所需類的內部資訊,允許程式執行時才得到所需類的內部資訊。反射能夠構建靈活的應用的程式。 

      使用反射為bean 賦值 ,主要表現在幾點,一:利用反射查找出bean類所有public方法,類定義的屬性。二:如果是賦值,必須先判斷屬性型別,再逐個賦值,

      三:呼叫method 類的invoke方法訪問bean 的set 、get 方法設值、取值。

      看下面程式碼:

package com.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

public class ReflectGetValue {
    /**
     * 取出bean 屬性和值
     * @param obj
     * @return
     * @throws Exception
     */
    public static Map<Object,Object> getFileValue(Object obj) throws Exception{
        Map<Object, Object> map = new HashMap<Object, Object>();
        Class<?> cls = obj.getClass();
        Method methods[] = cls.getDeclaredMethods();
        Field fields[] = cls.getDeclaredFields();
        
        for(Field field:fields){
            
            String fldtype = field.getType().getSimpleName();
            String getMetName = pareGetName(field.getName());
            String result ="";
            if(!checkMethod(methods,getMetName)){
                continue;
            }
            Method method = cls.getMethod(getMetName, null);
            Object object = method.invoke(obj, new Object[]{});
            if(null != object){
                if(fldtype.equals("Date")){
                    result = fmlDate((Date)object);
                }
                result = String.valueOf(object);
            }
            map.put(field.getName(), result);
        }
        
        return map;
    }
    /**
     * 設定bean 屬性值
     * @param map
     * @param bean
     * @throws Exception
     */
    public static void setFieldValue(Map<Object, Object> map, Object bean) throws Exception{
        Class<?> cls = bean.getClass();
        Method methods[] = cls.getDeclaredMethods();
        Field fields[] = cls.getDeclaredFields();
        
        for(Field field:fields){
            String fldtype = field.getType().getSimpleName();
            String fldSetName = field.getName();
            String setMethod = pareSetName(fldSetName);
            if(!checkMethod(methods, setMethod)){
                continue;
            }
            Object value = map.get(fldSetName);
            System.out.println(value.toString());
            Method method = cls.getMethod(setMethod, field.getType());
            System.out.println(method.getName());
            if(null != value){
                if("String".equals(fldtype)){
                    method.invoke(bean, (String)value);
                }else if("Double".equals(fldtype)){
                    method.invoke(bean, (Double)value);
                }else if("int".equals(fldtype)){
                    int val = Integer.valueOf((String)value);
                    method.invoke(bean, val);
                }
            }
            
        }    
    }
    /**
     * 拼接某屬性get 方法
     * @param fldname
     * @return
     */
    public static String pareGetName(String fldname){
        if(null == fldname || "".equals(fldname)){
            return null;
        }
        String pro = "get"+fldname.substring(0,1).toUpperCase()+fldname.substring(1);
        return pro;
    }
    /**
     * 拼接某屬性set 方法
     * @param fldname
     * @return
     */
    public static String pareSetName(String fldname){
        if(null == fldname || "".equals(fldname)){
            return null;
        }
        String pro = "set"+fldname.substring(0,1).toUpperCase()+fldname.substring(1);
        return pro;
    }
    /**
     * 判斷該方法是否存在
     * @param methods
     * @param met
     * @return
     */
    public static boolean checkMethod(Method methods[],String met){
        if(null != methods ){
            for(Method method:methods){
                if(met.equals(method.getName())){
                    return true;
                }
            }
        }        
        return false;
    }
    /**
     * 把date 類轉換成string
     * @param date
     * @return
     */
    public static String fmlDate(Date date){
        if(null != date){
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.US);
            return sdf.format(date);
        }
        return null;
    }
}

----------------------------------


測試方法

    public static void main(String[] args) {
        try {
            
            Map<Object, Object> map = new HashMap<Object, Object>();
            map.put("yi", "michael");
            map.put("san", "27");
            map.put("er", "2010-10-24");
           
            Bean bean = new Bean();
            ReflectGetValue.setFieldValue(map, bean);
            Map<Object, Object> m= ReflectGetValue.getFileValue(bean);
            System.out.println(m.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


相關推薦

利用java 反射原理一個通用

      首先了解一下反射的原理,什麼是反射?所謂的反射就是指java 語言在執行時擁有一項自觀的能力,反射能使你得到裝載到 jvm 中的類的內部資訊,它不需要你在編碼的時候就知道所需類的內部資訊,允許程式執行時才得到所需類的內部資訊。反射能夠構建靈活的應用的程式。 

android中利用java反射原理將物件新增到sqlit資料庫的萬能方法

利用java的反射機制,我們可以得到物件裡的方法列表,引數列表以及對應的值,那麼我們就可以利用這些做一個萬能的插入資料庫的方法。 以下方法中表名要和資料庫名一致。  protected void insert(Object ob){ContentValues initia

java使用反射給物件屬性

public class Rwhc implements Comparator<Rwhc> { private int id; //id private String qihao; //期號 private String kjh;

利用java反射將結果集封裝成為物件物件集合

java反射機制是什麼 反射機制是在執行狀態中,可以知道任何一個類的屬性和方法,並且呼叫類的屬性和方法; 反射機制能夠做什麼 1、判斷執行物件的所屬類 2、構造任意一個類的物件 3、獲取任意一個類的屬性和方法 4、呼叫任意屬性和方法 5、

個基於sqlhelperoracleHelper的通用資料訪問層

不久前做了個.net平臺上用oracle做後臺資料庫的小b/s,c/s混合專案. 之前做的專案用的是sqlserver資料庫,用的是微軟的sqlhelper作為資料訪問層. 到網上搜索了一遍,沒有找到微軟關於oracle的資料訪問層,下載一個petshop3.0,終於找到了

jQuery 給 data

1. data 賦值問題 data 賦值有兩種方法,一種是使用 $("div").data("greeting", "Hello World");  另一種是使用 (建議使用) $("div").attr("data-greeting", "Hello World");

UpdateData()函式&關於編輯框的

一、總結UpdateData()函式UpdateData(true);//用於將螢幕上控制元件中的資料交換到變數中。UpdateData(false);//用於將資料在螢幕中對應控制元件中顯示出來。       當你使用了ClassWizard建立了控制元件和變數之間的聯絡後

黑馬程式設計師 WPF中DataGrid的ItemsSource屬性的的差異

XMAL程式碼: <DataGrid x:Name=grid1 AutoGenerateColumns="True"></DataGrid> 定義一個類Book: public class Book { public in

jquery input

記錄一下: 在寫一個input賦值,二話不說就直接利用了$('#xx').val()來進行取值和賦值,取值ok,賦值後利用alert顯示正確,但是在html上並沒有正確的顯示出來,後來改為使用如下程式碼就可以正確的在頁面上顯示了: $("#Slider6").attr("v

前端js 實現Html標籤統一通用方法

通常我們獲取Html頁面中某個標籤的值,需要通過Id標籤一個一個去獲取,當頁面需要獲取的值很多時,這樣的工作無疑是枯燥且麻煩的,這時候就需要我們寫一些用於偷懶的小方法了。總結方法如下: var util = { init: null }; uti

一位從vb系轉到JAVA的朋友在一個中一個類似VB中MSGBOX的方法

fin return gen interface man text string listener com //此方法放一個自定義的JAVA類中 public static boolean msgBoxPlus(Activity objPage, String strTi

Android系統原理與原始碼分析(1):利用Java反射技術阻止通過按鈕關閉對話方塊

本文為原創,如需轉載,請註明作者和出處,謝謝!     眾所周知,AlertDialog類用於顯示對話方塊。關於AlertDialog的基本用法在這裡就不詳細介紹了,網上有很多,讀者可以自己搜尋。那

JAVA一個簡單的JS程式碼格式化工具

/** * cn.newweapon.JsFormatter */package cn.newweapon;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.FilenameFilter

(JDBC)利用Java反射編寫一個萬能的資料庫表查詢方法

        在用JDBC的過程中,我們可能會根據實際需求來編寫N個查詢方法(特別是新手),這樣雖然簡單,但是會產生大量的重複程式碼。且不容易維護。那麼有沒有辦法,只編寫一個方法呢?         通過分析,不難發現,對於查詢,我們發現除了SQL語句的變動意外,就是實體

利用java反射實現兩個具有相同屬性bean

import java.lang.reflect.Field; import java.lang.reflect.Method; public class ClassReflection { /** * @param class1 用於賦值的實體類

利用java反射機制模擬spring IOC原理的實現

在Java中反射和動態代理機制很強大,通過反射機制在執行時獲取資訊。用於實現IOC。 代理是Java基本的設計模式,提供向物件插入額外的或不同的操作。Java的動態代理能動態的建立代理物件,以及動態的呼叫代理方法。用於實現AOP。一、Java反射機制1、作用 (1)在執行時判斷任意一個物件所屬的類; (

集合70多種推薦演算法,東北大學老師用Java一個開源庫,在GitHub上收穫近1500個Star...

 【AI科技大本營導讀】在經過一年多的開發工作之後,LibRec 3.0 版本終於釋出了。LibRec 是一個基於 Java 的開源演算法工具庫,覆蓋了 70 餘個各型別推薦演算法,可以有效解決評分預測和物品推薦兩大關鍵的推薦問題,目前已經在 GitHub 上收穫

利用週末時間通過整合自己的程式設計知識一個微信朋友圈集贊程式

之前經常接收到微信好友發的訊息讓給朋友圈點贊,或是在朋友圈看到讓幫忙給他們點讚的內容。看到這個的訊息是不是覺得很煩呀,對於經常發這種訊息的人是不是瞬間就有了想拉黑的衝動?“程式碼改變世界”是部落格園的簽名,我的程式碼能改變些什麼?我們是不是可以換個角度想一想,既然你們有這個需求,那我就

JAVA一個七牛雲上傳檔案圖片的小工具

上傳圖片只能上傳png,jpg,jpeg等格式的,靜態程式碼塊載入配置檔案。 因為檔名必須經過簡單加密名字上傳,所以需要獲取圖片

一個簡單輪播效果實現

char line query span size html ef6 ava top <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">