«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Использование методов и дескрипторов переменных в Java для доступа к объектам и манипулирования ими во время выполнения

Использование методов и дескрипторов переменных в Java для доступа к объектам и манипулирования ими во время выполнения

Опубликовано 2 ноября 2024 г.
Просматривать:640

Using Method and Variable Handles in Java for Runtime Object Access and Manipulation

Отражение и дескрипторы методов/var — это две мощные функции Java, которые позволяют разработчикам получать доступ к объектам и манипулировать ими во время выполнения. Однако они различаются способом доступа к объектам и их обработки.

Давайте рассмотрим пример использования отражения для доступа к методу в классе. Мы начнем с простого класса MyClass, который имеет закрытую строковую переменную и метод получения для этой переменной. Чтобы создать этот объект, мы можем использовать обычное создание экземпляра:

MyClass objectInstance = new MyClass("John Doe");

Чтобы получить доступ к методу с помощью отражения, нам нужно сначала получить класс экземпляра нашего объекта с помощью метода getClass(). Затем мы можем использовать метод getDeclardMethod(), чтобы найти метод, к которому мы хотим получить доступ, в данном случае «getName». Наконец, нам нужно вызвать метод с помощью метода вызова() и передать экземпляр нашего объекта. Вот код этого процесса:

Class> clazz = objectInstance.getClass();
Method method = clazz.getDeclaredMethod("getName");
String value = (String) method.invoke(objectInstance);
System.out.println(value); // prints "John Doe"

С другой стороны, дескрипторы методов, находящиеся в классе MethodHandles, обеспечивают более безопасный и оптимизированный способ доступа к методам. Это связано с тем, что они были разработаны специально для этой цели и оптимизированы для оптимизации JVM.

Использование дескрипторов методов для доступа к методу аналогично использованию отражения. Начнем с получения класса экземпляра нашего объекта. Затем мы используем метод findVirtual() в MethodHandles для поиска метода, к которому мы хотим получить доступ. Затем мы вызываем метод с помощью метода вызова() и передаем экземпляр нашего объекта. Вот код этого процесса:

Class> clazz = objectInstance.getClass();
MethodHandle handle = MethodHandles.lookup().findVirtual(clazz, "getName", methodType(String.class));
String value = (String) handle.invoke(objectInstance);
System.out.println(value);  // Prints “John Doe”

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

Чтобы продемонстрировать возможности дескрипторов методов, давайте посмотрим, как их можно использовать для прямого доступа к частному полю в классе. Допустим, наш класс «MyClass» имеет частную строковую переменную с именем «name». Мы могли бы использовать отражение для доступа к нему, но использование дескрипторов методов — более безопасная альтернатива.

Чтобы напрямую получить доступ к частному полю с помощью отражения, нам сначала нужно получить класс экземпляра нашего объекта. Затем мы используем метод getDeclardField(), чтобы найти поле, к которому мы хотим получить доступ, в данном случае «имя». Однако, поскольку это поле является частным, нам нужно использовать метод setAccessible(), чтобы установить для его доступности значение true. Наконец, мы можем использовать метод get() для получения значения поля. Вот код этого процесса:

Class> clazz = objectInstance.getClass(); 
Field field = clazz.getDeclaredField("name"); 
field.setAccessible(true); 
String value = (String) field.get(objectInstance);
System.out.println(value); // prints “John Doe”

При использовании дескрипторов методов процесс аналогичен. Мы начинаем с получения класса экземпляра нашего объекта, а затем используем метод PrivateLookupIn() для MethodHandles, чтобы учесть модификаторы доступа к полю (поскольку оно является частным). Далее мы используем метод findVarHandle(), чтобы найти поле, к которому мы хотим получить доступ. Наконец, мы можем использовать метод get() для получения его значения. Вот код этого процесса:

Class> clazz = objectInstance.getClass(); 
VarHandle handle = MethodHandles.privateLookupIn(clazz, MethodHandles.lookup()).findVarHandle(clazz, "name", String.class);
String value = (String) handle.get(objectInstance);
System.out.println(value); // prints “John Doe”

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

Одним из ограничений дескрипторов методов является то, что они не позволяют обрабатывать проверенные исключения. Различные операции с дескрипторами методов и дескрипторами var вызывают проверенные исключения, которые необходимо перехватить и объявить в рабочем коде.

В заключение, дескрипторы методов и переменных предоставляют в JDK целый ряд возможностей для поиска метаданных классов и доступа к методам и полям за пределами обычных ограничений Java. Хотя они не охватывают все возможности отражения, они предлагают более безопасные и оптимизированные альтернативы для этих задач.

Воспользуйтесь лучшим способом подготовки к сертификации Java с помощью учебных планов MyExamCloud и насладитесь бесплатными практическими тестами.

Заявление о выпуске Эта статья воспроизводится по адресу: https://dev.to/myexamcloud/using-method-and-variable-handles-in-java-for-runtime-object-access-and-manipulation-22gn?1 При наличии каких-либо нарушений , пожалуйста, свяжитесь с Study_golang @163.comdelete
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3