2016-11-08 2 views
1

Я читаю JMH образцов, и теперь я нахожусь в разделе о inheritance. Вот замечание они сделали:Понимание java компиляции и наследования

потому мы знаем только иерархию типов во время компиляции, это возможно только в течение той же сессии компиляции. То есть, смешивая в подкласс, расширяющий ваш базовый класс после, компиляция JMH не повлияет.

Я не думал об этом аспекте компиляции, и поэтому это не кажется мне совершенно ясным. Мы могли бы использовать Class::getSuperClass. Пример:

@Benchmark 
public abstract class MyBenchmark{ 
    public void mb(){ 
     doSome(); 
    } 

    public abstract doSome(); 
} 

Я думал, что при компиляции этого класса JHM использует процессор аннотации для генерации эталона. И тогда, если мы попытаемся скомпилировать подкласс сказать

public class MyConcreteBenchmark extends MyBenchmark { 
    @Override 
    public void doSome(){ 
     //Do some 
    } 
} 

это не имеет никакого эффекта, потому что процессор аннотаций не имеет никакого отношения к процессу.

+0

Это комментарий, не вопрос. –

+0

@MarkoTopolnik Что значит? Я просто был смущен ** мы знаем только иерархию типов во время компиляции **. Что это должно было означать? –

+0

Обработчик аннотации запускается во время компиляции, правильно? –

ответ

2

JHM приходит перед компиляцией (анализирует и генерирует). Что-то вроде препроцессора или прекомпилятора. Поэтому jmh не видит дерево наследования, и невозможно увидеть унаследованные аннотации.

Lombock например работает таким же образом. Вот изображение демонстрирует, как она работает (просто заменить в виду Ломбок на JMH):

enter image description here

Readmore: Project Lombok: Creating Custom Transformations

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