Отражение Java: создание нового объекта с указанным типом - PullRequest
1 голос
/ 06 марта 2011

Я новичок в размышлениях и пытаюсь тренироваться с ним ...

Это код ...

 for (java.lang.reflect.Field field : fields) {

        String getter = "get"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1);
        String setter = "set"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1);
        java.lang.reflect.Method getterMethod;
        java.lang.reflect.Method setterMethod;

        try {
             getterMethod = this.getClass().getMethod(getter, null);
             Object valueGetted = getterMethod.invoke(this, null);

             Class[] paramForSetter = new Class[1];
             paramForSetter[0] = valueGetted.getClass();



             setterMethod = p.getClass().getMethod(setter, paramForSetter);
             setterMethod.invoke(p.getClass(),XXXX); 

             System.out.println("");

        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-Trace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

Я думаю, что это глупый вопрос ..В XXXXX я хочу получить объект с типом и значением value getted ...

Я подумал, что это было полезно ... но это не так.

        setterMethod.invoke(p.getClass(),(valueGetted.getClass().getName())  valueGetted );

Помощь!

Ответы [ 4 ]

3 голосов
/ 06 марта 2011

Возможно, вы захотите взглянуть на код BeanUtils от Apache Commons. Следующие функции должны быть полезны cloneBean () и copyProperties ().

1 голос
/ 06 марта 2011

Правильный код должен выглядеть следующим образом: Что следует отметить: - необходимо использовать getDeclaredFields () - геттеры не начинаются с get для логических полей - setter.invoke () должен вызываться с правильными параметрами - использование field.getType () при получении сеттера [обрабатывает типы примитивов)

import java.lang.reflect.Field;

public class Main {

    private static MyObject clone(MyObject p) {

        final MyObject clone = new MyObject();
        Field[] fields = p.getClass().getDeclaredFields();

        for (java.lang.reflect.Field field : fields) {

            // Boolean properties will hav eis prefix instead of get
            String getter = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
            String setter = "set" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
            java.lang.reflect.Method getterMethod;
            java.lang.reflect.Method setterMethod;

            try {
                getterMethod = p.getClass().getMethod(getter, null);
                Object valueGetted = getterMethod.invoke(p, null);

                Class[] paramForSetter = new Class[1];
                paramForSetter[0] = valueGetted.getClass();

                setterMethod = p.getClass().getMethod(setter, field.getType());
                setterMethod.invoke(clone, valueGetted);

                System.out.println(" Successfully copied " + field.getName());

            } catch (Exception ex) {
                System.err.println(" Error copying " + field.getName() + ": " + ex.getMessage());
            }
        }
        return clone;
    }

    public static void main(String[] args) {
        MyObject m = new MyObject(1, 2L, "3", true);
        System.out.println("Main.main: Original = " + m);
        MyObject c = clone(m);
        System.out.println("Main.main: Clone = " + c);
    }

}

class MyObject {

    private int myInt;
    private Long myLong;
    private String myString;
    private Boolean myBool;

    MyObject() {
    }

    MyObject(int myInt, Long myLong, String myString, Boolean myBool) {
        this.myInt = myInt;
        this.myLong = myLong;
        this.myString = myString;
        this.myBool = myBool;
    }

    public int getMyInt() {
        return myInt;
    }

    public void setMyInt(int myInt) {
        this.myInt = myInt;
    }

    public Long getMyLong() {
        return myLong;
    }

    public void setMyLong(Long myLong) {
        this.myLong = myLong;
    }

    public String getMyString() {
        return myString;
    }

    public void setMyString(String myString) {
        this.myString = myString;
    }

    public Boolean isMyBool() {
        return myBool;
    }

    public void setMyBool(Boolean myBool) {
        this.myBool = myBool;
    }

    @Override
    public String toString() {
        return "MyObject{" +
                "myInt=" + myInt +
                ", myLong=" + myLong +
                ", myString='" + myString + '\'' +
                ", myBool=" + myBool +
                '}';
    }
}
0 голосов
/ 23 февраля 2012

Я думаю, что гораздо проще, если вы хотите просто получить и установить значение поля, используя методы, предоставляемые Java Reflection API, а не пытаться получить имена методов получения и установки вручную.

Этот тип функции может использоваться для получения значения поля:

Object getFieldValue(Field afield, Object obj){

   if(!field.isAccessible()) field.setAccessible(true);

   return field.get(obj);

}

Вы можете получить значение поля, используя field.set (obj, value) ...

0 голосов
/ 06 марта 2011

Учитывая получатель Method m,

m.getReturnType().newInstance()

будет создавать экземпляр, пока тип f является конкретным типом public (не интерфейс или абстрактный класс) с public конструктор с нулевым аргументом.И он не будет работать для открытых, нестатических внутренних классов.

Он также не будет работать для примитивных типов возвращаемых данных, таких как Integer.TYPE.

Так, учитывая большой набор предостереженийЛучше всего написать метод, который проверяет тип возвращаемого значения и создает объект.Таким образом, вы можете вернуть Collections.emptyList() для абстрактного, но обычно используемого типа возврата List, и можете вернуть 0 для int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...