วิธีการตั้งค่าให้กับตัวแปรคลาสโดยไม่ต้องใช้ตัวตั้งค่า

ฉันต้องการแทรกค่าให้กับตัวแปร Object โดยไม่ใช้ตัวตั้งค่า เป็นไปได้อย่างไร..

นี่คือตัวอย่าง

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

ตอนนี้ฉันมีฟังก์ชันที่ประกอบด้วย variable name, value to be set และ Object of the Class X

ฉันกำลังพยายามใช้วิธีการทั่วไปเพื่อตั้งค่าเป็น Object(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
ฉันกำลังสร้างกลไกที่สร้างบางอย่างเช่นพูลสตริงสำหรับตาราง DB หลายตาราง ดังนั้นฉันจึงต้องการใช้มัน มันค่อนข้างซับซ้อนมากที่จะอธิบายในความคิดเห็น หวังว่าพวกคุณจะเข้าใจ   -  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 Injection -- "ผลักดัน" การพึ่งพาไปสู่คลาสที่เป็นรูปธรรมผ่านทรัพย์สินสาธารณะ ระบบการตั้งชื่อ "Setter" นำมาจาก Java โดยที่คุณสมบัติคือ getSomething() และ setSomething(value)

เนื่องจากคุณไม่ต้องการใช้ setters คุณสามารถสร้าง Constructor แบบกำหนดพารามิเตอร์ได้ Constructor แบบกำหนดพารามิเตอร์จะต้องส่งพารามิเตอร์ในการสร้างวัตถุ ยกเว้นฉันไม่คิดว่าจะมีวิธีอื่นในการทำเช่นนั้นโดยไม่ต้องเรียก ผู้ตั้งค่า

person Abhijeet Panwar    schedule 16.07.2014
comment
วัตถุถูกสร้างขึ้นแล้ว ดังนั้นคุณจึงไม่สามารถทำการแทรกคอนสตรัคเตอร์ได้ - person Dileep; 16.07.2014