Установить свойство для общего Java-бина - PullRequest
0 голосов
/ 04 января 2012

Возможно ли это?Я создаю объект из строки JSON с таким кодом:

String obj = new Gson().toJson(jsonArray.getJSONObject(i));
String className = getClassName(jsonArray.getJSONObject(i));

Class targetClass = null;
try {
    targetClass = Class.forName(className);
} catch (ClassNotFoundException e) {
                e.printStackTrace();
}

//Create Object
Object data = new Gson().fromJson(obj, targetClass);

Затем я выполняю некоторые операции с базой данных, получаю возвращаемое значение ключа и хочу установить этот ключ для объекта bean с помощью его setId (), но я не хочу приводить конкретный тип объекта к универсальному объекту, потому что для этого потребуется многократно повторять один и тот же код только для приведения объекта.

key = contactsListDAO.manageDataObj(data, sql, true);
((PhoneNumber) data).setId(key);

МожетЯ использую какой-то оператор if, чтобы проверить, содержит ли объект свойство id, и затем устанавливаю идентификатор для универсального объекта без необходимости приведения?

Ответы [ 3 ]

0 голосов
/ 04 января 2012

Если у вас есть (как вы упомянули) «несколько типов бинов» и «у них всех есть свойство id», почему бы вам не определить общий интерфейс для ваших бинов с помощью метода setId?

Вы получите свои bean-компоненты и просто приведете к интерфейсу, который будет безопасным и объектно-ориентированным подходом.Это жизнеспособное решение для вас?

0 голосов
/ 04 января 2012

Вот мой рабочий код. По какой-то причине я никогда не мог найти метод, использующий class.getMethod (), поэтому мне пришлось пройтись по массиву методов и сопоставить имена с методом setId, который, как я знал, существовал. Оттуда с помощью invoke был ключ к правильной установке свойства.

public void setIdOnObject(Object obj, int id, Class<?> targetClass) {
    Method[] methods = targetClass.getMethods();
    for(Method i : methods) {
        if(i.getName().equals("setId")) {
            try {
                i.invoke(obj, id);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }           
    }
}
0 голосов
/ 04 января 2012

отражение может сделать это, но я думаю, что, возможно, здесь вы должны сделать что-то еще.Напишите служебную функцию

public static <T> T fromJson(String json, Class<T> clzz)
{
return (T) new Gson().fromJson(obj, targetClass);
}

, и тогда вы сможете вызывать ее так, чтобы

PhoneNumber data = fromJson(obj, PhoneNumber.class); 

больше не преобразовывалось.

РЕДАКТИРОВАТЬ: если использование «объекта» является ограничением, вы можете использовать отражение

public void  setIdOnObject(Object obj, Object id)
    {
        try{
         Method m =  obj.getClass().getMethod("setId",id.getClass());
            m.invoke(obj, id );

        }catch(NoSuchMethodException  e){ return false; } catch (InvocationTargetException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (IllegalAccessException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }

Вот рабочий пример, который у меня есть, просто копировать-вставить-запустить.

import java.lang.reflect.InvocationTargetException;
public class Reflection
{

    public static void main( String[] args )
    {
        MyParent p = new MyParent();
        setParentKey( p, "parentKey" );

        MyObj o = new MyObj();
        setParentKey( o, "myParentKey" );
        setMyKey( o, "myKey" );

        System.out.println( "p = " + p );
        System.out.println( "o = " + o );

    }



    public static void invokeMethod( Object p, Object k, String methodName )
    {
        try
        {
            p.getClass().getMethod( methodName, k.getClass() ).invoke( p, k );
        }
        catch ( NoSuchMethodException e )
        {
            e.printStackTrace();
        }
        catch ( InvocationTargetException e )
        {
            e.printStackTrace();
        }
        catch ( IllegalAccessException e )
        {
            e.printStackTrace();
        }
    }

    public static void setParentKey( Object p, Object k )
    {
           invokeMethod( p,k,"setParentKey" );
    }

    public static void setMyKey( Object p, Object k )
    {
        invokeMethod( p,k,"setMyKey" );
    }

    public static class MyParent
    {
        private Object parentKey;
        public void setParentKey( String k )
        {
            parentKey = k;
        }

        @Override
        public String toString()
        {
            return "MyParent{" +
                           "parentKey=" + parentKey +
                           '}';
        }
    }

    public static class MyObj extends MyParent
    {
        private Object myKey;
        public void setMyKey( String k )
        {
            myKey = k;
        }

        @Override
        public String toString()
        {
            return "MyObj{" +
                           "myKey=" + myKey +
                           "} " + super.toString();
        }
    }
}

И ожидаемый результат:

p = MyParent{parentKey=parentKey}
o = MyObj{myKey=myKey} MyParent{parentKey=myParentKey}
...