返回给定bean的给定属性的值。
/******************************************************************************* * Copyright (C) 2011 Angelo Zerr <angelo.zerr@gmail.com>, Pascal Leclercq <pascal.leclercq@gmail.com> * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Angelo ZERR - initial API and implementation * Pascal Leclercq - initial API and implementation *******************************************************************************//*时 代 J a v a - N o w J a v a . c o m 提 供*/ //package com.nowjava; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class Main { /** * Returns the value of the given property for the given bean. * * @param source * the source bean * @param property * the property name to retrieve * @return the value of the given property for the given bean. */ public static Object getValue(Object source, String property) { if (property == null) { return source; } /** * n o w j a v a . c o m 提 供 **/ if (property.indexOf('.') == -1) { if (source == null) { return null; } PropertyDescriptor propertyDescriptor = getPropertyDescriptor( source.getClass(), property); return getValue(source, propertyDescriptor); } String[] properies = property.split("[.]"); for (int i = 0; i < properies.length; i++) { source = getValue(source, properies[i]); } return source; } /** * Returns the value of the given property for the given bean. * * @param source * the source bean * @param propertyDescriptor * the property to retrieve * @return the contents of the given property for the given bean. */ private static Object getValue(Object source, PropertyDescriptor propertyDescriptor) { try { Method readMethod = propertyDescriptor.getReadMethod(); if (readMethod == null) { throw new IllegalArgumentException( propertyDescriptor.getName() + " property does not have a read method."); //$NON-NLS-1$ } if (!readMethod.isAccessible()) { readMethod.setAccessible(true); } return readMethod.invoke(source, null); } catch (InvocationTargetException e) { /* * InvocationTargetException wraps any exception thrown by the * invoked method. */ throw new RuntimeException(e.getCause()); } catch (Exception e) { return null; } } /** * Returns the property descriptor of the given bean class and the given * property. * * @param beanClass * @param propertyName * @return the PropertyDescriptor for the named property on the given bean * class */ private static PropertyDescriptor getPropertyDescriptor( Class beanClass, String propertyName) { if (!beanClass.isInterface()) { BeanInfo beanInfo; try { beanInfo = Introspector.getBeanInfo(beanClass); } catch (IntrospectionException e) { // cannot introspect, give up return null; } PropertyDescriptor[] propertyDescriptors = beanInfo .getPropertyDescriptors(); for (int i = 0; i < propertyDescriptors.length; i++) { PropertyDescriptor descriptor = propertyDescriptors[i]; if (descriptor.getName().equals(propertyName)) { return descriptor; } } } else { try { PropertyDescriptor propertyDescriptors[]; List pds = new ArrayList(); getInterfacePropertyDescriptors(pds, beanClass); if (pds.size() > 0) { propertyDescriptors = (PropertyDescriptor[]) pds .toArray(new PropertyDescriptor[pds.size()]); PropertyDescriptor descriptor; for (int i = 0; i < propertyDescriptors.length; i++) { descriptor = propertyDescriptors[i]; if (descriptor.getName().equals(propertyName)) return descriptor; } } } catch (IntrospectionException e) { // cannot introspect, give up return null; } } throw new IllegalArgumentException( "Could not find property with name " + propertyName + " in class " + beanClass); //$NON-NLS-1$ //$NON-NLS-2$ }