集册 Java实例教程 使用setter方法将成员设置为值;如果未找到成员,则使用成员访问将成员设置为值

使用setter方法将成员设置为值;如果未找到成员,则使用成员访问将成员设置为值

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

405
使用setter方法将成员设置为值;如果未找到成员,则使用成员访问将成员设置为值

/**

 * Copyright (c) 2003-2009, Xith3D Project Group all rights reserved.

 * 

 * Portions based on the Java3D interface, Copyright by Sun Microsystems.

 * Many thanks to the developers of Java3D and Sun Microsystems for their

 * innovation and design.

 * 

 * Redistribution and use in source and binary forms, with or without

 * modification, are permitted provided that the following conditions are met:

 * 

 * Redistributions of source code must retain the above copyright notice,

 * this list of conditions and the following disclaimer.

 * 

 * Redistributions in binary form must reproduce the above copyright notice,

 * this list of conditions and the following disclaimer in the documentation

 * and/or other materials provided with the distribution.

 * 

 * Neither the name of the 'Xith3D Project Group' nor the names of its

 * contributors may be used to endorse or promote products derived from this

 * software without specific prior written permission.

 * 

 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE

 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR

 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF

 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS

 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN

 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) A

 * RISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE

 * POSSIBILITY OF SUCH DAMAGE

 */

import java.lang.reflect.Method;


public class Main{// 来自 时 代 J     a    v  a - nowjava.com

    public static void main(String[] argv) throws Exception{

        Object object = "nowjava.com";

        String member = "nowjava.com";

        Object value = "nowjava.com";

        set(object,member,value);

    }

    /**

     * Sets a member to a value using a setter method, or if none found,

     * using member access if the member is public

     * 

     * @param object

     *                The object of which to set the member

     * @param member

     *                The member to change

     * @param value

     *                The value to set the member to

     */

    public static void set(Object object, String member, Object value) {


        try {

        /** from 
        NowJava.com**/

            // try to find a setter

            Method met = getSetter(object, member);

            try {

                met.invoke(object, new Object[] { value });

            } catch (Exception e) {

                throw new Error(e);

            }


        } catch (NoSetterException e) {


            try {

                // try to set it via member access

                object.getClass().getField(member).set(object, value);

            } catch (NoSuchFieldException ex) {

                throw new Error("Couldn't find setter nor member of name "

                        + member + " in object of type : "

                        + object.getClass().getSimpleName());

            } catch (Exception ex) {

                throw new Error(ex);

            }


        }


    }

    /**

     * Finds the appropriate setter for the member of an object.

     * 

     * @param object The object

     * @param member Its member

     * @return The setter

     * @throws NoSetterException if no setter can be found

     */

    public static Method getSetter(Object object, String member)

            throws NoSetterException {


        StringBuffer buffer = new StringBuffer(member.length() + 4);

        buffer.append("set");

        buffer.append(member.substring(0, 1).toUpperCase());

        buffer.append(member.substring(1));

        String name = buffer.toString();


        Method met = null;


        try {

            // First try to get the most evident method, getMethod(memberType);

            Class<?> clazz = object.getClass().getDeclaredField(member)

                    .getType();

            // Try to find the method

            met = object.getClass().getMethod(name, new Class[] { clazz });

        } catch (Exception e) {

            // Didn't work ? Well, let's try another way..

        
展开阅读全文