Создаются ли перехватчики метода Cglib для каждого экземпляра класса? - PullRequest
0 голосов
/ 25 мая 2018

У меня есть следующая общая реализация перехватчика метода cglib:

public class EntityInterceptor<T, PK> implements MethodInterceptor{

    private EntityChangeType changeType;
    private T entity;
    private GenericCrudMapper<T,PK> mapper;

    public EntityInterceptor(T entity, GenericCrudMapper<T, PK> mapper){
        this.entity = entity;
        this.mapper = mapper;
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        // pass through
        return proxy.invoke(entity, args);
    }

    public void setEntityChangeType(EntityChangeType changeType){
        this.changeType = changeType;
    }

    public void saveChanges(){
        // @todo
    }

}

, который используется следующим образом:

@Override
    public Airport get(String id) {
        Airport airport = airportMapper.findById(id);
        if(airport != null){
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(Airport.class);
            enhancer.setCallback(new EntityInterceptor<>(airport, airportMapper));
            airport = (Airport) enhancer.create();
            return airport;
        }
        return airport;
    }

Могу ли я с уверенностью предположить, что созданный выше метод-перехватчик будет созданна расширенный экземпляр класса (другими словами, при назначении перехватчиков методов они не разделяются между всеми экземплярами класса)?

1 Ответ

0 голосов
/ 26 мая 2018

Да, вы можете быть уверены в этом.Однако ваше решение довольно неэффективно, поскольку для каждого экземпляра создается новый класс.Вместо этого вы должны создать свой прокси на основе типа перехватчика:

// Do once
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(realObject.getClass());
enhancer.setCallbackType(Airport.class);
Class classForProxy = enhancer.createClass();

// Do for each instance
Enhancer.registerCallbacks(classForProxy, new Callback[]{new EntityInterceptor<>(airport, airportMapper});
Object createdProxy = classForProxy.newInstance();

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

...