Подтвердить что ты не робот

Производительность во время отражения Java

Это академическое упражнение (отказ от ответственности).

Я создаю приложение, которое будет получать прибыль от как можно быстрее, поскольку оно будет конкурировать с другими.

Я знаю, что объявление класса с использованием отражения (пример ниже) будет страдать от огромного штрафа, а не стандартного объявления.

Class mDefinition = Class.forName("MySpecialClassString");
Constructor mConstructor = mDefinition.getConstructor(new Class[]{MySpecialClass.class});
myClass = (MySpecialClass) mConstructor.newInstance(this);

Однако после объявления myClass, если я использую его стандартным способом myClass.myMethod() , я также буду страдать от hogs производительности, или он будет таким же, как если бы я объявил класс в стандартная мода?

4b9b3361

Ответ 1

При первом экземпляре объекта будет снижаться производительность. Как только класс загружен, он будет таким же, как если бы он был создан в обычном режиме, и дальнейшее снижение производительности не будет.

Идем дальше, если вы вызываете методы с использованием отражения, будет снижаться производительность примерно пятнадцать раз (по умолчанию в Java), после чего отраженный вызов будет переписан JVM точно так же, как статически скомпилированный вызов, Поэтому даже многократно отраженные вызовы методов не будут приводить к снижению производительности, как только этот байт-код будет перекомпилирован JVM.

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

Ответ 2

Как только класс был загружен, вы должны быть в порядке. Накладные расходы связаны с проверкой структур времени выполнения, которые представляют класс, и т.д. Методы вызова стандартным образом должны быть точными, однако, если вы начнете поиск методов по имени или подписи, это повлечет дополнительные накладные расходы.

Ответ 3

Ответ Криса Томпсона на отметке. Однако я смущен вашим примером кода.

это будет динамически загружать класс:

Class mDefinition = Class.forName("MySpecialClassString");

Это получит Contructor для вашего класса, который принимает экземпляр того же класса, что и аргумент. Также обратите внимание, что вы получаете доступ к классу во время компиляции с помощью MySpecialClass.class:

Constructor mConstructor = mDefinition.getConstructor(new Class[]{MySpecialClass.class});

Это создает экземпляр MySpecialClass, передавая this в конструктор:

myClass = (MySpecialClass) mConstructor.newInstance(this);

Основываясь на аргументе конструктора, означает ли это, что мы находимся в методе экземпляра MySpecialClass? Очень смутно.

EDIT: Это ближе к тому, что я ожидал увидеть:

Class<?> mDefinition = Class.forName("MySpecialClassString");

//constructor apparently takes this as argument
Class<?> constructorArgType = this.getClass(); //could be ThisClassName.class

Constructor<?> mConstructor = mDefinition.getConstructor(constructorArgType);

MySpecialInterface mySpecialInstance = (MySpecialInterface)mConstructor.newInstance(this);

где MySpecialInterface - это интерфейс, используемый для взаимодействия с вашими динамически загружаемыми классами:

interface MySpecialInterface {
    //methods used to interface with dynamically loaded classes
}

В любом случае, пожалуйста, дайте мне знать, если я не понимаю или не могу здесь.