Возможно, это не новая проблема, однако у меня возникли проблемы с поиском решения, поскольку большинство ответов на этот вопрос относятся к рассматриваемому методу, который не является общедоступным.
Контекст
Существует пакет с именем reflection
, в котором определены аннотации, а также класс UITester
, последний использует аннотацию класса и аннотацию метода.Другой пакет с именем gui
содержит класс MinimalUI
, который затем проверяет доступ к UITester
, его методам и соответствующим значениям аннотаций.Однако я сталкиваюсь с NoSuchMethodException
.
Code
FunctionAnnotation
Аннотация используется для блокировки / разблокировки методов.
package reflection;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@Retention( RetentionPolicy.RUNTIME )
@Target( {ElementType.METHOD} )
public @interface FunctionAnnotation
{
boolean locked();
}
SampleAnnotation
Простая аннотация для установки некоторых базовых свойств класса.
package reflection;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention( RetentionPolicy.RUNTIME )
public
@interface SampleAnnotation
{
String name();
String value();
boolean output();
}
UITester
Thisэто аннотированный класс.Само объявление класса аннотировано и является одним из методов класса, поэтому используются обе ранее показанные аннотации.
package reflection;
@SampleAnnotation( name = "default", value = "[MINIMAL UI ANNOTATION] Testing.", output = true )
public class UITester
{
public UITester()
{
System.out.println( "[UI TESTER] Created." );
}
public void print( String value )
{
System.out.println( "[UI TESTER] Printing: " + value );
}
@FunctionAnnotation( locked = false )
public void printIfAvailable( String value )
{
System.out.println( "[UI TESTER] Printing (available): " + value );
}
}
MinimalUI
Наконец, существует минимальныйКласс пользовательского интерфейса, который реализует интерфейс Gui
, объявленный в том же пакете.Я публикую только соответствующий метод теста, потому что в противном случае этот образец станет немного большим.Следующий код является методом MinimalUI#testUI
.Необходимо прочитать аннотации, установленные для UITester
, и вести себя в соответствии с результатами.Реализация минималистична и не имеет защитных механизмов, и это нормально, потому что это проект с песочницей, где я тестирую шаблоны для передачи в производство.Код:
@Override
public void testUI()
{
UITester tester = new UITester();
Annotation annotation = UITester.class.getAnnotation( SampleAnnotation.class );
if ( annotation instanceof SampleAnnotation )
{
String value = ( (SampleAnnotation) annotation ).value();
tester.print( value );
try
{
Method possiblyLockedMethod = UITester.class.getMethod( "printIfAvailable" );
Annotation methodLockCheck = possiblyLockedMethod.getAnnotation( FunctionAnnotation.class );
if ( !( ( FunctionAnnotation) methodLockCheck ).locked() ) tester.printIfAvailable( value );
}
catch( NoSuchMethodException e )
{
System.out.println( "[MINIMAL UI][ERROR] Cannot find method to be retrieved. Reflection failed. " + e.getMessage() );
}
catch( Exception e )
{
System.out.println( "[MINIMAL UI][ERROR] Exception during UI testing via reflection: " + e.getMessage() + " Exception: " + e.toString() );
}
}
else
{
System.out.println( "[MINIMAL UI][ERROR] Reflection error. Unable to read annotation!" );
}
}
Вопрос
Запуск MinimalUI#testUI
приводит к выбрасыванию NoSuchMethodException
, поэтому я не понимаю, почему.Точная строка, выдающая исключение: Method possiblyLockedMethod = UITester.class.getMethod( "printIfAvailable" );
.
- Влияют ли аннотации на поведение
getMethod
?Возможно, объявление класса как-то изменено? - Метод
printIfAvailable
объявлен public
, так почему же он не найден?Влияют ли аннотации на статус public
? - Обе аннотации помечены
@Retention( RetentionPolicy.RUNTIME )
, возможно ли, что это предотвращает определение функции при загрузке класса или что-то в этом роде?
Я предполагаю, что эточто-то простое, что мне не хватает.В настоящее время не было опечаток, которые я смог найти, так что там происходит?