Sets the value of the specified property in given bean - Java Reflection

Java examples for Reflection:Java Bean

Description

Sets the value of the specified property in given bean

Demo Code

/**/*from w w w .jav  a 2s . co m*/
 * JLibs: Common Utilities for Java
 * Copyright (C) 2009  Santhosh Kumar T <santhosh.tekuri@gmail.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 */
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Locale;

public class Main{
    public static void main(String[] argv) throws Exception{
        Object bean = "java2s.com";
        String property = "java2s.com";
        Object value = "java2s.com";
        setProperty(bean,property,value);
    }
    /** prefix used by non-boolean getter methods */
    public static final String GET = "get";
    /** prefix used by boolean getter methods */
    public static final String IS = "is";
    /** prefix used by setter methods */
    public static final String SET = "set";
    /**
     * Sets the value of the specified <code>property</code> in given <code>bean</code>
     *
     * @param bean      bean object
     * @param property  property name whose value needs to be set
     * @param value     value to be set
     *
     * @throws InvocationTargetException if method invocation fails
     * @throws NullPointerException if <code>property</code> is not found in <code>bean</code> or it is readonly property
     */
    public static void setProperty(Object bean, String property,
            Object value) throws InvocationTargetException {
        try {
            getSetterMethod(bean.getClass(), property).invoke(bean, value);
        } catch (IllegalAccessException ex) {
            throw new ImpossibleException(ex); // because setter method is public
        }
    }
    /**
     * Returns setter method for <code>property</code> in specified <code>beanClass</code>
     *
     * @param beanClass bean class
     * @param property  name of the property
     *
     * @return setter method. null if <code>property</code> is not found, or it is readonly property
     *
     * @see #getSetterMethod(Class, String, Class)
     */
    public static Method getSetterMethod(Class<?> beanClass, String property) {
        Method getter = getGetterMethod(beanClass, property);
        if (getter == null)
            return null;
        else
            return getSetterMethod(beanClass, property,
                    getter.getReturnType());
    }
    /**
     * Returns setter method for <code>property</code> in specified <code>beanClass</code>
     *
     * @param beanClass bean class
     * @param property  name of the property
     * @param propertyType type of the property. This is used to compute setter method name.
     *
     * @return setter method. null if <code>property</code> is not found, or it is readonly property
     *
     * @see #getSetterMethod(Class, String)
     */
    public static Method getSetterMethod(Class<?> beanClass,
            String property, Class propertyType) {
        try {
            return beanClass.getMethod(SET + getMethodSuffix(property),
                    propertyType);
        } catch (NoSuchMethodException ex) {
            return null;
        }
    }
    /**
     * Returns getter method for <code>property</code> in specified <code>beanClass</code>
     *
     * @param beanClass bean class
     * @param property  name of the property
     *
     * @return getter method. null if <code>property</code> is not found
     *
     * @see #getGetterMethod(Class, String, Class)
     */
    public static Method getGetterMethod(Class<?> beanClass, String property) {
        try {
            return beanClass.getMethod(GET + getMethodSuffix(property));
        } catch (NoSuchMethodException ex1) {
            try {
                return beanClass.getMethod(IS + getMethodSuffix(property));
            } catch (NoSuchMethodException ex2) {
                return null;
            }
        }
    }
    /**
     * Returns getter method for <code>property</code> in specified <code>beanClass</code>
     *
     * @param beanClass bean class
     * @param property  name of the property
     * @param propertyType type of the property. This is used to compute getter method name.
     *
     * @return getter method. null if <code>property</code> is not found
     *
     * @see #getGetterMethod(Class, String)
     */
    public static Method getGetterMethod(Class<?> beanClass,
            String property, Class propertyType) {
        try {
            try {
                if (propertyType == boolean.class)
                    return beanClass.getMethod(IS
                            + getMethodSuffix(property));
            } catch (NoSuchMethodException ignore) {
                // ignore
            }
            return beanClass.getMethod(GET + getMethodSuffix(property));
        } catch (NoSuchMethodException ex) {
            return null;
        }
    }
    public static String getMethodSuffix(String property) {
        switch (property.length()) {
        case 0:
            throw new IllegalArgumentException("invalid property name: "
                    + property);
        case 1:
            return property.toUpperCase(Locale.ENGLISH);
        default:
            char char0 = property.charAt(0);
            boolean upper0 = Character.isUpperCase(char0);
            char char1 = property.charAt(1);
            boolean upper1 = Character.isUpperCase(char1);
            if (upper0 && upper1) // XCoordinate ==> getXCordinate()
                return property;
            if (!upper0 && !upper1) // xcoordinate ==> getXcoordinate()
                return Character.toUpperCase(char0) + property.substring(1);
            if (!upper0 && upper1) // xCoordinate ==> getxCoordinate()
                return property;
            throw new IllegalArgumentException("invalid property name: "
                    + property);
        }
    }
}

Related Tutorials