java - 在运行时向类的任何实例添加方法

标签 java reflection

我有一个类似这样的方法

public Collection<V> values()

在运行时我想向 V 添加一个字段和 getter 方法。

举个例子

Collection<Person> persons = map.values();

Collection<OtherObject> otherObjectCollection = map.values();

我想确保任何实例都始终有一个字段/方法,

persons.getXXX();
otherObjectCollection.getXXX();

所以在我的

map.values() 

我希望能够在运行时向我的 V 实例添加字段和方法。

最佳答案

基本上你不能这样做。在 Java 中,您无法在执行时向类型添加字段和方法。您可能想要创建自己的类型来包装原始类型并维护 Map<String, Objet>对于附加值:

public final class Annotated<T> {
    private final Map<String, Object> annotations = new HashMap<>();
    private final T wrapped;

    public Annotated(T wrapped) {
        this.wrapped = wrapped;
    }

    public T getWrapped() {
        return wrapped;
    }

    public void setAnnotation(String name, Object value) {
        annotations.put(name, value);
    }

    public Object getAnnotation(String name) {
        return annotations.get(name);
    }
}

当然,这不会帮助您添加方法,但不清楚为什么您想要...我的猜测是您来自动态类型语言的背景。不要尝试将相同的习惯用法应用于 Java - 它们不会很好地工作。相反,应该从更大的角度看一下您想要完成的任务,并找出最合适的类似 Java 的方法。

关于java - 在运行时向类的任何实例添加方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18382431/

相关文章:

java - RabbitMQ + Spring 集成。队列大小1,仅在覆盖时删除

java - 根据属性获取列表中的重复元素,无需 for 循环

java - Java 中的反射——意外的输出

java - Java Swing 还在使用吗?

java - 使用 Gson 优雅地处理嵌套的 json 对象?

java - 为什么Java编译器允许通过空对象访问静态变量?

c# - “Object does not match target type” 用反射调用泛型方法时

c# - 将反射方法转换为已编译的 lambda

java - 在访问私有(private)方法和变量时使用反射API好吗?

c# - 如何找到所有包含匹配模式的类型/成员的程序集?