1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/kkk001-hp-reflect

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

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 и расширяем его для поддержки вызовов методов и свойств частного типа, делая его более универсальным.

Использование

  • 1 Вызов метода класса
	MethodAccess methodAccess = MethodAccess.get(fooInstance.getClass());
	Object rlt = methodAccess.invoke(fooInstance, "method11", "xxx");
  • 2 Получение/установка значения свойства класса
	FieldAccess fieldAccess = FieldAccess.get(fooInstance.getClass());
	fieldAccess.set(fooInstance, "stringField1", "abc");
  • 3 Создание экземпляра класса
	ConstructorAccess<FooService> access = ConstructorAccess.get(FooService.class);
    FooService fooService = access.newInstance();

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/kkk001-hp-reflect.git
git@api.gitlife.ru:oschina-mirror/kkk001-hp-reflect.git
oschina-mirror
kkk001-hp-reflect
kkk001-hp-reflect
master