Java 反射工具類

來源:互聯網
上載者:User

標籤:

package com.su.dolphin.utils;import java.lang.reflect.Array;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/** *  * @className: ReflectionUtil * @description: 反射工具類 * @author: gaoshuai * @date: 2015年8月5日 下午4:51:49 */public class ReflectionUtil{    /**     *      * @title: setField     * @description: 設定某個成員遍曆的值     * @param owner     * @param fieldName     * @param value     * @throws Exception     * @return: void     */    public static void setField(Object owner, String fieldName, Object value) throws Exception {        Class<?> ownerClass = owner.getClass();        Field field = ownerClass.getDeclaredField(fieldName);        field.setAccessible(true);        field.set(owner, value);    }        /**     *      * @title: setFieldAll     * @description: 可以設定父類的field的值     * @param owner     * @param fieldName     * @param value     * @throws Exception     * @return: void     */    public static void setFieldAll(Object owner, String fieldName, Object value) throws Exception {        Class<?> ownerClass = owner.getClass();        Field field = null;        for (Class<?> clazz = ownerClass; clazz != Object.class; clazz = clazz.getSuperclass()) {            try {                field = clazz.getDeclaredField(fieldName);                LogUtil.d(field + " find : in " + clazz.getName());                break;            }            catch (Exception e) {                LogUtil.d(fieldName + " not find in " + clazz.getName());            }        }        field.setAccessible(true);        field.set(owner, value);    }        /**     * 得到某個對象的公用屬性     *      * @param owner     *            , fieldName     * @return 該屬性對象     * @throws Exception     *      */    public static Object getField(Object owner, String fieldName) throws Exception {        Class<?> ownerClass = owner.getClass();                Field field = ownerClass.getField(fieldName);                Object property = field.get(owner);                return property;    }        /**     * 得到某類的靜態公用屬性     *      * @param className     *            類名     * @param fieldName     *            屬性名稱     * @return 該屬性對象     * @throws Exception     */    public static Object getStaticField(String className, String fieldName) throws Exception {        Class<?> ownerClass = Class.forName(className);                Field field = ownerClass.getField(fieldName);                Object property = field.get(ownerClass);                return property;    }        /**     * 執行某對象方法     *      * @param owner     *            對象     * @param methodName     *            方法名     * @param args     *            參數     * @return 方法傳回值     * @throws Exception     */    public static Object invokeMethod(Object owner, String methodName, Object... args) throws Exception {                Class<?> ownerClass = owner.getClass();                Class<?>[] argsClass = new Class[args.length];                for (int i = 0, j = args.length; i < j; i++) {            if (args[i].getClass() == Integer.class) { //一般的函數都是 int 而不是Integer                argsClass[i] = int.class;            }            else if (args[i].getClass() == Float.class) { //一般的函數都是 int 而不是Integer                argsClass[i] = float.class;            }            else if (args[i].getClass() == Double.class) { //一般的函數都是 int 而不是Integer                argsClass[i] = double.class;            }            else {                argsClass[i] = args[i].getClass();            }        }                Method method = ownerClass.getDeclaredMethod(methodName, argsClass);        method.setAccessible(true);        return method.invoke(owner, args);    }        /**     *      * @title: invokeMethodAll     * @description: 調用所有的函數, 包括父類的所有函數     * @param owner     * @param methodName     * @param args     * @return     * @throws Exception     * @return: Object     */    public static Object invokeMethodAll(Object owner, String methodName, Object... args) throws Exception {                Class<?> ownerClass = owner.getClass();                Class<?>[] argsClass = new Class[args.length];                for (int i = 0, j = args.length; i < j; i++) {            if (args[i].getClass() == Integer.class) { //一般的函數都是 int 而不是Integer                argsClass[i] = int.class;            }            else if (args[i].getClass() == Float.class) { //一般的函數都是 int 而不是Integer                argsClass[i] = float.class;            }            else if (args[i].getClass() == Double.class) { //一般的函數都是 int 而不是Integer                argsClass[i] = double.class;            }            else {                argsClass[i] = args[i].getClass();            }        }        Method method = null;                for (Class<?> clazz = ownerClass; clazz != Object.class; clazz = clazz.getSuperclass()) {            try {                method = clazz.getDeclaredMethod(methodName, argsClass);                LogUtil.d(method + " find : in " + clazz.getName());                return method;            }            catch (Exception e) {                //e.printStackTrace();                LogUtil.d(methodName + " not find in " + clazz.getName());            }        }        method.setAccessible(true);        return method.invoke(owner, args);    }        /**     * 執行某類的靜態方法     *      * @param className     *            類名     * @param methodName     *            方法名     * @param args     *            參數數組     * @return 執行方法返回的結果     * @throws Exception     */    public static Object invokeStaticMethod(String className, String methodName, Object... args) throws Exception {        Class<?> ownerClass = Class.forName(className);                Class<?>[] argsClass = new Class[args.length];                for (int i = 0, j = args.length; i < j; i++) {            argsClass[i] = args[i].getClass();        }                Method method = ownerClass.getMethod(methodName, argsClass);        method.setAccessible(true);        return method.invoke(null, args);    }        /**     * 建立執行個體     *      * @param className     *            類名     * @param args     *            建構函式的參數 如果無構造參數,args 填寫為 null     * @return 建立的執行個體     * @throws Exception     */    public static Object newInstance(String className, Object[] args) throws NoSuchMethodException, SecurityException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {        return newInstance(className, args, null);            }        /**     * 建立執行個體     *      * @param className     *            類名     * @param args     *            建構函式的參數 如果無構造參數,args 填寫為 null     * @return 建立的執行個體     * @throws Exception     */    public static Object newInstance(String className, Object[] args, Class<?>[] argsType) throws NoSuchMethodException, SecurityException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {        Class<?> newoneClass = Class.forName(className);                if (args == null) {            return newoneClass.newInstance();                    }        else {            Constructor<?> cons;            if (argsType == null) {                Class<?>[] argsClass = new Class[args.length];                                for (int i = 0, j = args.length; i < j; i++) {                    argsClass[i] = args[i].getClass();                }                                cons = newoneClass.getConstructor(argsClass);            }            else {                cons = newoneClass.getConstructor(argsType);            }            return cons.newInstance(args);        }            }        /**     * 是不是某個類的執行個體     *      * @param obj     *            執行個體     * @param cls     *            類     * @return 如果 obj 是此類的執行個體,則返回 true     */    public static boolean isInstance(Object obj, Class<?> cls) {        return cls.isInstance(obj);    }        /**     * 得到數組中的某個元素     *      * @param array     *            數組     * @param index     *            索引     * @return 返回指定數組對象中索引組件的值     */    public static Object getItemInArray(Object array, int index) {        return Array.get(array, index);    }        /**     *      * @title: GetClassListByPackage     * @description: 擷取包下的所有Class     * @param pPackage     * @return     * @return: Class<?>     */    public static Class<?> getClassListByPackage(String pPackage) {        Package _Package = Package.getPackage(pPackage);        Class<?> _List = _Package.getClass();                return _List;    }}



注意: 

1.調用getMethods方法輸出的是自身的public方法和父類Object的public方法。調用getDeclaredMethods方法輸出的是自身的public、protected、private方法。

2.如果想擷取父類的私人函數

    public static Method getDeclaredMethod(Object object, String methodName, Class<?> ... parameterTypes){          Method method = null ;                    for(Class<?> clazz = object.getClass() ; clazz != Object.class ; clazz = clazz.getSuperclass()) {              try {                  method = clazz.getDeclaredMethod(methodName, parameterTypes) ;                  return method ;              } catch (Exception e) {              }          }                    return null;      }  


Java 反射工具類

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.