集册 Java实例教程 不管属性是可见的还是隐藏的,或者是在给定的类,超类或已实现的接口中声明的,都将调用属性的设置器。

不管属性是可见的还是隐藏的,或者是在给定的类,超类或已实现的接口中声明的,都将调用属性的设置器。

欢马劈雪     最近更新时间:2020-01-02 10:19:05

538
不管属性是可见的还是隐藏的,或者是在给定的类,超类或已实现的接口中声明的,都将调用属性的设置器。

/*

 * Copyright (c) 2012 Data Harmonisation Panel

 * 

 * All rights reserved. This program and the accompanying materials are made

 * available under the terms of the GNU Lesser General Public License as

 * published by the Free Software Foundation, either version 3 of the License,

 * or (at your option) any later version.

 * 

 * You should have received a copy of the GNU Lesser General Public License

 * along with this distribution. If not, see <http://www.gnu.org/licenses/>.

 * 

 * Contributors:

 *     HUMBOLDT EU Integrated Project #030962

 *     Data Harmonisation Panel <http://www.dhpanel.eu>

 */

//package com.nowjava;

/**
时代Java - nowjava.com 提供 
**/

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;


public class Main {

    /**

     * Invokes a setter for a property, no matter if the setter is visible or

     * hidden or if it is declared in the given class or in a superclass or

     * implemented interface.

     * 

     * @param bean the object to invoke the public setter on

     * @param propertyName the name of the property that shall be updated

     * @param value the value passed to the setter

     * @throws IllegalArgumentException if the argument's type is invalid

     * @throws IllegalAccessException if the setter is not accessible

     * @throws InvocationTargetException if the setter throws an exception

     * @throws NoSuchMethodException if there is no setter for this property

     */

    public static void setDeepProperty(Object bean, String propertyName,

            Object value) throws IllegalArgumentException,

            IllegalAccessException, InvocationTargetException,

            NoSuchMethodException {

        Method setter = findDeepSetter(bean.getClass(), propertyName,

                value.getClass());

        if (setter == null) {

            throw new NoSuchMethodException("There is " + //$NON-NLS-1$

                    "no setter for property " + propertyName); //$NON-NLS-1$

        }


        invokeSetter(bean, setter, value);

    }
/* from 时   代     Java  公  众  号 - nowjava.com*/

    /**

     * Returns a setter method for a given property, no matter if the method is

     * visible or hidden or if it is declared in the given class or in a

     * superclass or implemented interface.

     * 

     * @param c the class which would contain the setter method

     * @param property the property

     * @param propertyType the property's type

     * @return the setter or null if there is no setter for this property

     */

    public static Method findDeepSetter(Class<?> c, String property,

            Class<?> propertyType) {

        if (c == Object.class || c == null) {

            return null;

        }


        char[] propertyNameArr = property.toCharArray();

        propertyNameArr[0] = Character.toUpperCase(propertyNameArr[0]);

        String setterName = "set" + new String(propertyNameArr); //$NON-NLS-1$


        Method result = null;

        // search visible and hidden methods in this class

        Method[] methods = c.getDeclaredMethods();

        for (Method m : methods) {

            if (m.getName().equals(setterName)

                    && m.getParameterTypes().length == 1

                    && (propertyType == null || m.getParameterTypes()[0]

                            .isAssignableFrom(propertyType))) {

                result = m;

                break;

            }

        }


        // search superclass and interfaces

        if (result == null) {

            result = findDeepSetter(c.getSuperclass(), property,

                    propertyType);

            if (result == null) {

                Class<?>[] interfaces = c.getInterfaces();

                for (Class<?> inter : interfaces) {

                    result = findDeepSetter(inter, property, propertyType);

                    if (result != null) {

                        break;

                    }

                }

            }

        }


        return result;

    }


    
展开阅读全文