Я создал специальную аннотацию под названием @Register и Я хочу, чтобы на карту добавлялись только методы, помеченные этой аннотацией. Однако я сталкиваюсь с некоторыми проблемами при использовании отражения для доступа и хранения методов, особенно с доступностью методов и работой с нестатическими методами.
Код: Выделить всё
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
// Custom annotation definition
@Retention(RetentionPolicy.RUNTIME)
@interface Register {}
// Example class with annotated methods
class ExampleService {
@Register
public void serviceMethod1() {
System.out.println("Service Method 1");
}
@Register
public void serviceMethod2() {
System.out.println("Service Method 2");
}
public void nonRegisteredMethod() {
System.out.println("This method should not be registered.");
}
}
// Class to register methods
class MethodRegistry {
private final Map methodMap = new HashMap();
public void registerAnnotatedMethods(Class clazz) {
for (Method method : clazz.getDeclaredMethods()) {
if (method.isAnnotationPresent(Register.class)) {
methodMap.put(method.getName(), method);
}
}
}
public void invokeMethod(String methodName, Object instance) throws Exception {
Method method = methodMap.get(methodName);
if (method != null) {
method.invoke(instance);
} else {
System.out.println("Method not found in the registry.");
}
}
public Map getMethodMap() {
return methodMap;
}
}
// Main class to test
public class ReflectionTest {
public static void main(String[] args) {
MethodRegistry registry = new MethodRegistry();
registry.registerAnnotatedMethods(ExampleService.class);
// Check the registered methods
System.out.println("Registered methods: " + registry.getMethodMap().keySet());
// Try invoking a registered method
try {
registry.invokeMethod("serviceMethod1", new ExampleService());
} catch (Exception e) {
e.printStackTrace();
}
}
}
- Когда я пытаюсь вызвать зарегистрированный метод, он отлично работает для аннотированных методов, но я получаю сообщение об ошибке, если метод является частным или защищенным. Как я могу обрабатывать частные или защищенные методы, которые аннотированы?
- Есть ли лучший способ управлять вызовом нестатических методов с помощью этой структуры? особенно при обработке потенциального исключения IllegalAccessException или InvoctionTargetException?
Что я пробовал: я реализовал метод RegisterAnnotatedMethods, который использует отражение для поиска методов в заданном классе, помеченных @Register. Затем я сохраняю эти методы на карте, используя их имена в качестве ключей. Я также создал метод ignoreMethod для вызова этих зарегистрированных методов по имени, передав экземпляр класса для вызова нестатических методов.
Что я ожидал: Я ожидал, что метод RegisterAnnotatedMethods найдет все методы, помеченные @Register, независимо от их модификаторов доступа (открытый, частный или защищенный), и добавит их на карту. Когда я использовал ignoreMethod, я ожидал, что он вызовет метод в предоставленном экземпляре без каких-либо проблем с доступом.
Что произошло на самом деле: Код работает для общедоступных методов, но происходит сбой с IllegalAccessException для частных и защищенных методов при попытке их вызова. Кроме того, у меня возникли проблемы с управлением вызовами нестатических методов без явного создания экземпляра каждый раз.
Дальнейшее пояснение: Я хотел бы знать, как это сделать. обрабатывать частные и защищенные методы, аннотированные @Register, и существует ли более эффективный способ обработки нестатических вызовов.
Подробнее здесь: https://stackoverflow.com/questions/791 ... ss-methods
Мобильная версия