Invokes a public getter for a property - Java Reflection

Java examples for Reflection:Getter

Description

Invokes a public getter for a property

Demo Code

/*//from w  ww.j a  v  a2s. c o  m
 * 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>
 */
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.JarURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.zip.ZipException;

public class Main{
    /**
     * Invokes a public getter for a property
     * 
     * @param <T> the result type
     * @param bean the object to invoke the public getter on
     * @param propertyName the name of the property to retrieve
     * @return the property's value
     * @throws IllegalArgumentException if the argument's type is invalid
     * @throws IllegalAccessException if the getter is not accessible
     * @throws InvocationTargetException if the getter throws an exception
     * @throws NoSuchMethodException if there is no getter for this property
     */
    public static <T> T getProperty(Object bean, String propertyName)
            throws IllegalArgumentException, IllegalAccessException,
            InvocationTargetException, NoSuchMethodException {
        Method getter = findGetter(bean.getClass(), propertyName,
                Object.class);
        if (getter == null) {
            throw new NoSuchMethodException("There is " + //$NON-NLS-1$
                    "no getter for property " + propertyName); //$NON-NLS-1$
        }

        return ReflectionHelper.<T> invokeGetter(bean, getter);
    }
    /**
     * Returns a public getter method for a given property
     * 
     * @param c the class which would contain the getter method
     * @param property the property
     * @param propertyType the property's type
     * @return the public getter or null if there is no getter for this property
     */
    public static Method findGetter(Class<?> c, String property,
            Class<?> propertyType) {
        char[] propertyNameArr = property.toCharArray();
        propertyNameArr[0] = Character.toUpperCase(propertyNameArr[0]);
        String getterName = "get" + new String(propertyNameArr); //$NON-NLS-1$

        Method result = null;
        Method[] methods = c.getMethods();
        for (Method m : methods) {
            if (m.getName().equals(getterName)
                    && m.getParameterTypes().length == 0
                    && (propertyType == null || propertyType
                            .isAssignableFrom(m.getReturnType()))) {
                result = m;
                break;
            }
        }

        return result;
    }
    /**
     * Invokes a getter method on a given bean
     * 
     * @param <T> the result type
     * @param bean the object to invoke the getter on
     * @param getter the getter method
     * @return the property's value
     * @throws IllegalArgumentException if the argument's type is invalid
     * @throws IllegalAccessException if the getter is not accessible
     * @throws InvocationTargetException if the getter throws an exception
     */
    @SuppressWarnings("unchecked")
    private static <T> T invokeGetter(Object bean, Method getter)
            throws IllegalArgumentException, IllegalAccessException,
            InvocationTargetException {
        boolean accessible = getter.isAccessible();
        getter.setAccessible(true);
        T result = null;
        try {
            result = (T) getter.invoke(bean);
        } finally {
            getter.setAccessible(accessible);
        }

        return result;
    }
}

Related Tutorials