HP-Reflect (High Performance Reflect)
HP-Reflect — это высокопроизводительный инструмент для отражения. Он использует технологию байт-кода для динамического создания класса доступа. Благодаря различным классам доступа можно эффективно получать значения полей, вызывать методы или создавать экземпляры. Инструмент очень полезен в базовой структуре.
Для динамического создания классов доступа используется Javassist, что позволяет напрямую вызывать конкретные сущности классов вместо рефлексивного вызова и значительно повышает производительность отражения.
Например, если у нас есть экземпляр класса A с именем instance и метод methodX, который мы хотим вызвать, то при использовании JDK для рефлексивного вызова мы будем использовать следующий код:
instance.getClass().getMethod("methodX", xxxType).invoke(instance, xxx);
Также мы можем создать байт-код для вызова метода methodX следующим образом:
public class A {
public Object methodX(xxxType param) {
......
}
public Object methodY(yyyType param) {
......
}
}
// Создаём класс, подобный следующему, используя динамическую технологию байт-кода
public class AMethodAccess {
public Object invoke(Object instance, String methodName, Object[] params){
A a = (A) instance;
switch(methodName) {
case "methodX":
return a.methodX(params[0]);
case "methodY":
return a.methodY(params[0]);
default:
throw new RuntimeException("method not found:" + methodName);
}
}
}
// Фактический вызов
new AMethodAccess().invoke(instance, "methodX"), new Object[]{param});
Следуя этой идее, мы можем использовать Javassist для динамического создания байт-кода и создания экземпляров нужных нам классов доступа, что позволит нам реализовать отражение, как прямой вызов метода. Аналогично, для ускорения скорости рефлексивных вызовов методов и конструкторов классов, а также свойств, можно использовать аналогичные методы.
Эта идея основана на ReflectASM, но ReflectASM реализован с использованием ASM и не поддерживает вызовы методов и свойств частного типа. Поэтому здесь мы используем Javassist и расширяем его для поддержки вызовов методов и свойств частного типа, делая его более универсальным.
MethodAccess methodAccess = MethodAccess.get(fooInstance.getClass());
Object rlt = methodAccess.invoke(fooInstance, "method11", "xxx");
FieldAccess fieldAccess = FieldAccess.get(fooInstance.getClass());
fieldAccess.set(fooInstance, "stringField1", "abc");
ConstructorAccess<FooService> access = ConstructorAccess.get(FooService.class);
FooService fooService = access.newInstance();
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )