Я хотел бы избежать отражения в проекте с открытым исходным кодом, который я разрабатываю. Здесь у меня есть классы вроде следующего.Улучшение поля получить и установить производительность с ASM или Javassist
public class PurchaseOrder {
@Property
private Customer customer;
@Property
private String name;
}
Я просматриваю для @Property
аннотацию, чтобы определить, что можно установить и получить от PurchaseOrder рефлекторно. Существует много таких классов, которые используют java.lang.reflect.Field.get()
и java.lang.reflect.Field.set()
.
В идеале я хотел бы генерировать для каждого свойства invoker, как показано ниже.
public interface PropertyAccessor<S, V> {
public void set(S source, V value);
public V get(S source);
}
Теперь, когда я просматриваю класс я могу создать статический внутренний класс PurchaseOrder
как так.
static class customer_Field implements PropertyAccessor<PurchaseOrder, Customer> {
public void set(PurchaseOrder order, Customer customer) {
order.customer = customer;
}
public Customer get(PurchaseOrder order) {
return order.customer;
}
}
С этими словами я полностью избегаю стоимости отражения. Теперь я могу установить и получить из своих экземпляров собственную производительность. Может ли кто-нибудь сказать мне, как я это сделаю. Пример кода был бы замечательным. Я искал сеть для хорошего примера, но не могу найти ничего подобного. Примеры ASM и Javasist также довольно бедны.
Ключ здесь в том, что у меня есть интерфейс, который я могу пройти. Таким образом, у меня могут быть различные реализации, возможно, один с Java Reflection по умолчанию, один с ASM и один с Javassist?
Любая помощь была бы принята с благодарностью.
, учитывая ваше текущее описание, трудно понять, какова конечная цель. Почему бы просто не использовать Ломбок? Он предлагает поколение геттеров/сеттеров без отражения: http://projectlombok.org/ – SteveD
Мне не нужны геттеры и сеттеры. Целью является производительность!Родные настройки и получение до 14 раз быстрее, чем отражение. JAXB использует аналогичную схему, как и многие другие инструменты, требующие динамического взаимодействия с POJOS. –
@ng: почему вы считаете, что геттеры/сеттеры оценивают стоимость? Недавние JVM ужасно хороши в оптимизации общих шаблонов производительности, а getter/setter - это общий шаблон, который он получает. Единственная причина для поиска таких оптимизаций будет заключаться в том, что если ваше приложение работает с не очень мощным JVM, которое не так хорошо оптимизирует (например, сотовый телефон). –