Cara menetapkan nilai ke variabel kelas tanpa menggunakan setter

Saya ingin memasukkan nilai ke variabel Object tanpa menggunakan setter. Bagaimana bisa kalau bisa.

Ini adalah sebuah contoh

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

Sekarang saya memiliki fungsi yang berisi variable name, value to be set dan Object of the Class X.

Saya mencoba menggunakan metode umum untuk menetapkan nilai ke Objek (objectOfClass) dengan nilai yang telah saya berikan (valueToBeSet) dalam variabel yang sesuai (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 sumber
comment
Mengapa Anda ingin melakukan ini?   -  person Code-Apprentice    schedule 16.07.2014
comment
Hal ini dapat dilakukan dengan Refleksi. Tapi kenapa?   -  person Thilo    schedule 16.07.2014
comment
Jika kami mengetahui tujuan Anda melakukan ini, kemungkinan besar kami dapat menyarankan solusi yang jauh lebih elegan. Tolong beri kami beberapa konteks. Anda pada dasarnya bertanya bagaimana cara menulis kode Java dengan cepat, dan itu permintaan yang sangat tidak biasa.   -  person aliteralmind    schedule 16.07.2014
comment
Saya membuat mekanisme yang menciptakan sesuatu seperti kumpulan string, untuk beberapa tabel DB. JADI saya perlu penggunaannya. Cukup rumit untuk dijelaskan di komentar. Semoga kalian mengerti   -  person Dileep    schedule 16.07.2014


Jawaban (3)


Kode ini tidak diuji. Anda dapat mencoba ini.

Kelas yang akan diimpor

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;

Metode

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
baik kodenya terlihat oke, akan segera dicoba dan diperbarui. terima kasih :) - person Dileep; 16.07.2014

Jika Anda yakin benar-benar membutuhkannya, harap berpikir dua kali, namun tetap saja:

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
baik ini berfungsi dengan baik untuk variabel apa pun yang memiliki cakupan publik. Terima kasih :) - person Dileep; 16.07.2014

Ada dua cara untuk menetapkan nilai dalam objek

1-Injeksi Konstruktor -- "Mendorong" dependensi ke kelas konkret melalui argumen konstruktor.

2-Injeksi Penyetel -- "Mendorong" dependensi ke dalam kelas konkrit melalui properti publik. Nomenklatur "Setter" diambil dari Java dengan properti getSomething() dan setSomething(value).

Karena Anda tidak ingin menggunakan setter, Anda dapat membuat konstruktor berparameter untuk melakukannya. Konstruktor berparameter diperlukan untuk meneruskan parameter pada pembuatan objek. Kecuali itu, saya rasa tidak ada cara lain untuk melakukan itu tanpa menelepon setter.

person Abhijeet Panwar    schedule 16.07.2014
comment
Objek sudah dibuat, jadi Anda tidak bisa melakukan injeksi konstruktor. - person Dileep; 16.07.2014