集册 Java实例教程 无论如何,调用属性的吸气剂或获取匹配字段。

无论如何,调用属性的吸气剂或获取匹配字段。

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

498
无论如何,调用属性的吸气剂或获取匹配字段。

/*

 * 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;
/*
时 代 J a v a 公 众 号 - N o w J a v  a . c o m 提 供
*/

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;
/**
时代Java公众号 - nowjava.com 提供 
**/

import java.util.jar.JarEntry;

import java.util.jar.JarFile;

import java.util.zip.ZipException;


public class Main{

    /**

     * Invokes a getter for a property, or gets the matching field, no matter

     * what.

     * 

     * @param bean the object to invoke the getter on

     * @param propertyName the name of the property to retrieve

     * @param valueClass the class of the property or field

     * @return the property's value

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

     * @throws InvocationTargetException if the getter throws an exception

     * @throws IllegalStateException is the field could be found or accessed

     */

    @SuppressWarnings("unchecked")

    public static <T> T getDeepPropertyOrField(Object bean,

            String propertyName, Class<T> valueClass)

            throws IllegalArgumentException, InvocationTargetException {

        try {

            return ReflectionHelper.getDeepProperty(bean, propertyName);

        } catch (NoSuchMethodException e) {/* ignore */

        } catch (IllegalAccessException e) {/* ignore */

        }


        // there is no getter for the property. try to get the field directly

        Field f = findDeepField(bean.getClass(), propertyName, valueClass);

        if (f == null) {

            throw new IllegalStateException("Could not find "

                    + "field for property " + propertyName + " in class "

                    + bean.getClass().getCanonicalName());

        }


        boolean access = f.isAccessible();

        f.setAccessible(true);

        try {

            return (T) f.get(bean);

        } catch (Exception e) {

            throw new IllegalStateException("Could not get "

                    + "field for property " + propertyName + "in class "

                    + bean.getClass().getCanonicalName(), e);

        } finally {

            f.setAccessible(access);

        }

    }

    /**

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

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

     * implemented interface.

     * 

     * @param <T> the result type

     * @param bean the object to invoke the 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 setter is not accessible

     * @throws InvocationTargetException if the setter throws an exception

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

     */

    public static <T> T getDeepProperty(Object bean, String propertyName)

            throws IllegalArgumentException, IllegalAccessException,

            InvocationTargetException, NoSuchMethodException {

        Method getter = findDeepGetter(bean.getClass(), propertyName, null);

        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 field for a given property, no matter if the field is visible

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

     * 

     * @param c the class which would contain the field

     * @param property the property

     * @param propertyType the property's type

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

     */

    public static Field findDeepField(Class<?> c, String property,

            Class<?> propertyType) {

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

            return null;

        }


        Field result = null;

        // search visible and hidden fields in this class

        Field[] fields = c.getDeclaredFields();

        for (Field f : fields) {

            String fn = f.getName();

            if (fn.charAt(0) == '_') {

                // handle code style

                fn = fn.substring(1);

            }

            if (fn.equals(property)

                    && (propertyType == null || f.getType()

                            .isAssignableFrom(propertyType))) {

                result = f;

                break;

            }

        }


        // search superclass

        if (result == null) {

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

                    propertyType);

        }


        return result;

    }

    /**

     * Returns a getter 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 getter method

     * @param property the property

     * @param propertyType the property's type (can be null if the type does not

     *            matter)

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

     */

    public static Method findDeepGetter(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 getterName = "get" + 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(getterName)

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

                    && (propertyType == null || propertyType

                            .isAssignableFrom(m.getReturnType()))) {

                result = m;

                break;

            }

        }


        // search superclass and interfaces

        if (result == null) {

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

                 
展开阅读全文