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. - Java Reflection

Java examples for Reflection:Setter

Description

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.

Demo Code

/*//  www  . j  ava 2s  .com
 * 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.java2s;

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);
    }

    /**
     * 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;
    }

    /**
     * Invokes a setter method on a given bean
     * 
     * @param bean the object to invoke the getter on
     * @param setter the setter method
     * @param value the value to set
     * @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
     */
    private static void invokeSetter(Object bean, Method setter,
            Object value) throws IllegalArgumentException,
            IllegalAccessException, InvocationTargetException {
        boolean accessible = setter.isAccessible();
        setter.setAccessible(true);
        try {
            setter.invoke(bean, value);
        } finally {
            setter.setAccessible(accessible);
        }
    }
}

Related Tutorials