Le main :

import edf.inout.Context;

public class Main {

    public static void main(String[] args) {
        Form form = new Form();
        Context context = new Context();
       
        context.put("name", "Toto");
        context.put("surname", "Bimbo");
        form.injectFields(context);
       
        System.out.println(form.name);
        System.out.println(form.surname);
    }
}

Un bean :

public class Form extends InOut {
    @In
    public String name;
   
    public String surname = "Lala";
}


Le résultat

Toto
Lala

La classe utilitaire :

package edf.inout;

import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Set;


public class InOut {

    public void injectFields(Context context) {
        for (Field field : this.getInFields()) {
            String name = field.getName();
            setFieldValue(this, field, name, context.get(name));
        }
    }

    private  void setFieldValue(Object bean, Field field, String name, Object value) {
        try {
            field.set(bean, value);
        } catch (Exception e) {
            throw new IllegalArgumentException("could not set field value: "
                    + getAttributeMessage(name), e);
        }
    }

    private String getAttributeMessage(String attributeName) {
        return attributeName;
    }

    private Set<Field> getInFields() {
        Set<Field> inFields = new HashSet<Field>();
        for (Field field : this.getClass().getDeclaredFields()) {
            if (field.isAnnotationPresent(In.class)) {
                inFields.add(field);
            }
        }
        return inFields;
    }

}

Un exemple de contexte :

package edf.inout;

import java.util.HashMap;
import java.util.Map;

public class Context {

    private Map<String, Object> context;

    public Context() {
        context = new HashMap<String, Object>();
    }

    public Object get(String key) {
        return context.get(key);
    }

    public void put(String key, Object value) {
        context.put(key, value);
    }
}