In Java, how to get attribute given the string with its name?

前端 未结 5 1045
粉色の甜心
粉色の甜心 2020-12-25 13:51

I\'m sorry for asking this sort of questions, but I really couldn\'t find the answer in Google. So say I have a class with private String myColor and I have a s

相关标签:
5条回答
  • 2020-12-25 14:10

    If I understand your question correctly... You should create public getters and setters:

    public void setMyColor(String color) {
        this.myColor = color;
    }
    
    public String getMyColor {
        return this.myColor;
    }
    
    0 讨论(0)
  • 2020-12-25 14:28

    You can use reflection to inspect the content of any object, as follows:

    Object o = ...; // The object you want to inspect
    Class<?> c = o.getClass();
    
    Field f = c.getDeclaredField("myColor");
    f.setAccessible(true);
    
    String valueOfMyColor = (String) f.get(o);
    

    Note that getDeclaredField() will only return field's declared by the object's class. If you're looking for a field that was declared by a superclass you should loop over all classes of the object (by repeatedly doing c = c.getSuperclass() until c == null)

    If you want to change the value of the field you can use the set method:

    f.set(o, "some-new-value-for-field-f-in-o")
    

    Additional details: https://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Field.html


    https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getField(java.lang.String)

    You can use getField(...) which will search on super class if not found in class.

    0 讨论(0)
  • 2020-12-25 14:31

    Based on the edit, my suggestion is to use a Map to contain a map of preference name to appropriate text field or other text component. Just build the map when you build the user interface.

    Map<String, JTextField> guiFields = new HashMap<String, JTextField>();
    

    Then you can have the code do

    guiFields.get(inputName).setText(value);
    
    0 讨论(0)
  • 2020-12-25 14:32

    You must create a 'mutator' to modify private member variables.

    class example{
        private string myColor;
        public void changeColor(string newColor){
            myColor = newColor;
        }
    }
    
    0 讨论(0)
  • 2020-12-25 14:36

    It depends where you want to do this. Inside the class you simply whatever with it, e.g:

    myColor = "blah blah";
    

    From outside, you need to have some public method generally as other posts indicated. In all cases, you have to be careful if your environment in multi-threaded. Class level variables are not thread safe.

    0 讨论(0)
提交回复
热议问题