Как установить значения переменных класса без использования сеттеров

Я хочу вставить значение в переменную Object без использования сеттеров. Как можно, если это возможно.

это пример

Class X{
String variableName;
// getters and setters
}

Теперь у меня есть функция, которая содержит variable name, value to be set и Object of the Class X.

Я пытаюсь использовать общий метод для установки значения объекта (objectOfClass) со значением, которое я передал (valueToBeSet) в соответствующей переменной (variableName).

Object functionName(String variableName, Object valueToBeSet, Object objectOfClass){

    //I want to do the exact same thing as it does when setting the value using the below statement
    //objectOfClass.setX(valueToBeSet);

return objectOfClass;
}

person Dileep    schedule 16.07.2014    source источник
comment
почему ты хочешь сделать это?   -  person Code-Apprentice    schedule 16.07.2014
comment
Это можно сделать с помощью рефлексии. Но почему?   -  person Thilo    schedule 16.07.2014
comment
Если бы мы знали, для чего вы это делаете, вполне вероятно, что мы могли бы предложить гораздо более элегантное решение. Пожалуйста, дайте нам контекст. По сути, вы спрашиваете, как писать Java-код на лету, и это довольно необычная просьба.   -  person aliteralmind    schedule 16.07.2014
comment
Я создаю механизм, который создает что-то вроде пула строк для нескольких таблиц БД. ТАК мне нужно его использование. Это довольно сложно объяснить в комментариях. Надеюсь, вы, ребята, понимаете   -  person Dileep    schedule 16.07.2014


Ответы (3)


Этот код не тестировался. Вы можете попробовать это.

Классы для импорта

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;

Метод

public Object functionName(String variableName, Object valueToBeSet, Object objectOfClass) throws IntrospectionException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{

        //I want to do the exact same thing as it does when setting the value using the below statement
        //objectOfClass.setX(valueToBeSet);
        Class clazz = objectOfClass.getClass();
        BeanInfo beanInfo = Introspector.getBeanInfo(clazz, Object.class); // get bean info
        PropertyDescriptor[] props = beanInfo.getPropertyDescriptors(); // gets all info about all properties of the class.
        for (PropertyDescriptor descriptor : props) {
            String property = descriptor.getDisplayName();
            if(property.equals(variableName)) {
                String setter = descriptor.getWriteMethod().getName();
                Class parameterType = descriptor.getPropertyType();
                Method setterMethod = clazz.getDeclaredMethod(setter, parameterType); //Using Method Reflection
                setterMethod.invoke(objectOfClass, valueToBeSet);
            }

        }

    return objectOfClass;
    }
person Shiju K Babu    schedule 16.07.2014
comment
хорошо, код выглядит нормально, скоро постараюсь обновить. спасибо :) - person Dileep; 16.07.2014

Если вы уверены, что вам это действительно нужно, подумайте дважды, но все же:

import java.lang.reflect.Field;
...
X x = new X();
Field variableName = x.getClass().getDeclaredField("variableName");

// this is for private scope
variableName.setAccessible(true);

variableName.set(x, "some value");
person p_xr    schedule 16.07.2014
comment
хорошо, это отлично работает для любой переменной, имеющей общедоступную область. В любом случае спасибо :) - person Dileep; 16.07.2014

Есть два способа установки значений в объекте

1-Внедрение конструктора -- "Проталкивание" зависимостей в конкретный класс с помощью аргументов конструктора.

2-Внедрение сеттера -- "Проталкивание" зависимостей в конкретный класс через общедоступные свойства. Номенклатура "Setter" взята из Java, где свойствами являются getSomething() и setSomething(value).

Поскольку вы не хотите использовать сеттеры, вы можете создать параметризованный конструктор для этого. Параметризованные конструкторы необходимы для передачи параметров при создании объектов. Кроме этого, я не думаю, что есть какой-либо другой способ сделать это без вызова сеттеры.

person Abhijeet Panwar    schedule 16.07.2014
comment
Объект уже создан, поэтому вы не можете выполнить инъекцию конструктора. - person Dileep; 16.07.2014