javareflectionfield

Set field value with reflection


I'm working with one project which is not opensource and I need to modify one or more its classes.

In one class is following collection:

private Map<Integer, TTP> ttp = new HashMap<>(); 

All what I need to do is use reflection and use concurrenthashmap here. I've tried following code but it doesnt work.

Field f = ..getClass().getDeclaredField("ttp");
f.setAccessible(true);
f.set(null, new ConcurrentHashMap<>());

Solution

  • Hopefully this is what you are trying to do:

    import java.lang.reflect.Field;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    
    public class Test {
        
        private Map ttp = new HashMap(); 
        
        public  void test() {
            Field declaredField =  null;
            try {
                
                declaredField = Test.class.getDeclaredField("ttp");
                boolean accessible = declaredField.isAccessible();
    
                declaredField.setAccessible(true);
                
                ConcurrentHashMap<Object, Object> concHashMap = new ConcurrentHashMap<Object, Object>();
                concHashMap.put("key1", "value1");
                declaredField.set(this, concHashMap);
                Object value = ttp.get("key1");
    
                System.out.println(value);
    
                declaredField.setAccessible(accessible);
                
            } catch (NoSuchFieldException 
                    | SecurityException
                    | IllegalArgumentException 
                    | IllegalAccessException e) {
                e.printStackTrace();
            }
            
        }
    
        public static void main(String... args) {
            Test test = new Test();
            test.test(); 
        }
    }
    

    It prints :

    value1