Java 在运行时将方法添加到类的任何实例

Java 在运行时将方法添加到类的任何实例,java,reflection,Java,Reflection,我有一个这样的方法 public Collection<V> values() 所以在我的 map.values() 我希望能够在运行时将字段和方法添加到我的V实例中。基本上,您不能这样做。在Java中,不能在执行时向类型添加字段和方法。您可能需要创建自己的类型来包装原始类型,并为其他值维护一个Map: public final class Annotated<T> { private final Map<String, Object> anno

我有一个这样的方法

public Collection<V> values()
所以在我的

map.values() 

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

基本上,您不能这样做。在Java中,不能在执行时向类型添加字段和方法。您可能需要创建自己的类型来包装原始类型,并为其他值维护一个
Map

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);
    }
}
公共最终类注释{
私有最终映射注释=新HashMap();
私人最终T包装;
公共注释(T包装){
this.wrapped=wrapped;
}
公共T getWrapped(){
返回包装;
}
公共void setAnnotation(字符串名称、对象值){
注释.put(名称、值);
}
公共对象getAnnotation(字符串名称){
返回annotations.get(name);
}
}

当然,这不会帮助您添加方法,但不清楚您为什么要。。。我猜你来自一个动态类型语言的背景。不要试图将相同的习惯用法应用于Java,它们不会很好地工作。相反,请看一看您试图完成的工作的大局,并找出最合适的类似Java的方法。

我最终将该功能转移到了一个单独的Analyzer类。

好吧,让我试着解释一下我正在做什么。我有一个类可以接受某种对象,这些对象可以是任何东西。然后我可以应用一个搜索过滤器,我会得到一个点击列表。该列表包含原始对象类型。但我想知道搜索有多好。是100%的比赛还是10%的比赛。但由于我不知道我的对象的实例,所以无法计算百分比。但是如果我可以在运行时添加这个方法,我就可以在任何实例上调用getHitRate()。@BeauJohnnyBekkestad:你所有的类都有
getHitRate
方法吗?如果是这样,请将其放在接口中。听起来你应该返回一个
集合
而不是
集合
。。。如果你给我上课,情况就不同了。我可以公开一个API供您实现,但这不是我在本例中想要做的。。。当然,如果我不能做到我所想的,那么我将不得不采取不同的方法。@BeauJohnnyBekkestad:你到底想做什么还不清楚,但你肯定不能在Java中向现有对象添加字段或方法,所以你需要一种不同的方法。。。我强烈要求你们考虑在这里使用构图。带有元数据的搜索结果与结果本身不同。
persons.getXXX();
otherObjectCollection.getXXX();
map.values() 
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);
    }
}