如何为java对象动态添加属性?

时间:2012-10-11 05:05:07

标签: java

有学生班。

Class Student{
    String _name;
    ....
    ....

    public Student(){
    }
}

是否有可能向Student对象添加动态属性? 不延长学生班级。

4 个答案:

答案 0 :(得分:14)

简而言之,是的,可以在运行时修改字节码,但它可能非常混乱,并且(很可能)不是您想要的方法。但是,如果您决定采用这种方法,我建议使用字节码操作库,例如ASM。

更好的方法是使用Map<String, String>表示“动态”getter和setter,使用Map<String, Callable<Object>>表示任何不是getter或setter的东西。然而,最好的方法可能是重新考虑为什么你需要动态类。

public class Student {

    private Map<String, String> properties = new HashMap<String, String>();
    private Map<String, Callable<Object>> callables = new HashMap<String, Callable<Object>>();
    ....
    ....
    public String getProperty(String key) {
        return properties.get(key);
    }

    public void setProperty(String key, String value) {
        properties.put(key, value);
    }

    public Object call(String key) {
        Callable<Object> callable = callables.get(key);
        if (callable != null) {
            return callable.call();
        }
        return null;
    }

    public void define(String key, Callable<Object> callable) {
        callables.put(key, callable);
    }
}

作为一个注释,可以使用此概念定义void方法,方法是使用Callable并在其中返回null。

答案 1 :(得分:7)

你可能会进入字节码操作,但这种疯狂存在(特别是对于必须维护代码的程序员而言)。

将属性存储在Map<String,String>中。

答案 2 :(得分:1)

答案 3 :(得分:0)

虽然你可以用别人建议的一些棘手而复杂的方式做到这一点。

但是您可以确定某些data structure中的属性(适当的属性为Map)。由于您可以修改现有属性,因此可以使用数据结构。你可以为它们添加更多的属性..这将是一个更好的方法..