2013-08-22 2 views
1

У меня есть метод, который выглядит как этотДобавить метод к любому экземпляру класса во время выполнения

public Collection<V> values() 

Во время выполнения я хотел бы добавить метод поля и геттер к В.

позвольте мне дать вы пример

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

или

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

я хотел бы, чтобы убедиться, что любой экземпляр всегда будет иметь поле/метод,

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

так в моем

map.values() 

я хотел бы иметь возможность добавлять поля и методы к моему V экземпляр во время выполнения.

ответ

0

Вы не можете этого сделать, в основном. Вы не можете добавлять поля и методы к типам во время выполнения на 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); 
    } 
} 

Это не поможет вам добавить метод конечно, но это не ясно, почему ты» d хочу ... я предполагаю, что вы пришли из фона на динамически типизированном языке. Не пытайтесь применять те же самые идиомы к Java - они не будут работать хорошо. Вместо этого взгляните на более общую картину того, что вы пытаетесь выполнить, и определите наиболее подходящий для него подход, подобный Java.

+0

Хорошо, позвольте мне попытаться объяснить немного больше, что я делаю. У меня есть класс, который может принимать какие-то объекты, объекты могут быть чем угодно. Затем я могу применить фильтр поиска, и я верну список списков. Этот список содержит исходный тип объекта. Но я хочу знать, насколько хорош был поиск. Было ли это 100% -ным совпадением или 10% -ным совпадением. Но так как я не знаю экземпляр своего объекта, я не могу рассчитать процент. Но если бы я мог добавить этот метод во время выполнения, я мог бы вызвать getHitRate() в любом экземпляре ... –

+0

@BeauJohnnyBekkestad: У всех ваших классов есть метод getHitRate? Если это так, поместите это в интерфейс. Похоже, вы должны возвращать 'Collection >' вместо 'Collection '. –

+0

Это будет работать только в том случае, если я поставлю класс ... Если вы предоставите мне класс, то ситуация будет иной. Я мог бы выставить API для реализации, но это не то, что я хотел сделать в этом примере ... Конечно, если я не могу делать то, о чем думал, тогда мне пришлось бы использовать другой подход. –

0

В результате я переместил эту функциональность в отдельный класс анализатора.

Смежные вопросы