Производительность во время отражения Java
Это академическое упражнение (отказ от ответственности).
Я создаю приложение, которое будет получать прибыль от как можно быстрее, поскольку оно будет конкурировать с другими.
Я знаю, что объявление класса с использованием отражения (пример ниже) будет страдать от огромного штрафа, а не стандартного объявления.
Class mDefinition = Class.forName("MySpecialClassString");
Constructor mConstructor = mDefinition.getConstructor(new Class[]{MySpecialClass.class});
myClass = (MySpecialClass) mConstructor.newInstance(this);
Однако после объявления myClass
, если я использую его стандартным способом myClass.myMethod()
, я также буду страдать от hogs производительности, или он будет таким же, как если бы я объявил класс в стандартная мода?
Ответы
Ответ 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
}
В любом случае, пожалуйста, дайте мне знать, если я не понимаю или не могу здесь.