8

有学生课。

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

    public Student(){
    }
}

是否有可能向学生对象添加动态属性? 在不扩展学生班级的情况下。

4

4 回答 4

18

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

更好的方法是将 aMap<String, String>用于“动态”getter 和 setter,并将 aMap<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);
    }
}

请注意,您可以通过使用 Callable 并在其中返回 null 来使用此概念定义 void 方法。

于 2012-10-11T05:24:48.267 回答
8

您可以进行字节码操作,但这种方式很疯狂(尤其是对于必须维护代码的程序员)。

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

于 2012-10-11T05:11:11.420 回答
1

在运行时将新方法和属性注入到类中

仅使用Java就可以吗?

创建代理对象

于 2012-10-11T05:14:00.547 回答
0

尽管您可以使用其他人建议的一些棘手且复杂的方式来做到这一点..

但是你可以肯定有你的属性data structure(一个合适的将是 a Map)。因为你可以修改你现有的属性,所以可以用你的数据结构来完成。您可以为它们添加更多属性..这将是一个更好的方法..

于 2012-10-11T05:11:17.337 回答