Невозможно найти публичный метод через getMethod () - PullRequest
0 голосов
/ 04 декабря 2018

Возможно, это не новая проблема, однако у меня возникли проблемы с поиском решения, поскольку большинство ответов на этот вопрос относятся к рассматриваемому методу, который не является общедоступным.

Контекст

Существует пакет с именем 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 ), возможно ли, что это предотвращает определение функции при загрузке класса или что-то в этом роде?

Я предполагаю, что эточто-то простое, что мне не хватает.В настоящее время не было опечаток, которые я смог найти, так что там происходит?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Ваша проблема сейчас заключается в том, что вы используете getMethod -метод неправильно.Вы просто ищете метод без каких-либо параметров.Если вы измените его на UITester.class.getMethod( "printIfAvailable", String.class );, он будет работать нормально.

JavaDoc:

/**
 * Returns a {@code Method} object that reflects the specified public
 * member method of the class or interface represented by this
 * {@code Class} object. The {@code name} parameter is a
 * {@code String} specifying the simple name of the desired method. The
 * {@code parameterTypes} parameter is an array of {@code Class}
 * objects that identify the method's formal parameter types, in declared
 * order. If {@code parameterTypes} is {@code null}, it is
 * treated as if it were an empty array.
 * ...
0 голосов
/ 04 декабря 2018

Вызов UITester.class.getMethod( "printIfAvailable" ) означает, что вы пытаетесь получить метод с именем printIfAvailable, который принимает без параметров (параметр parameterTypes для getMethod - это var-arg).

Однако ваш метод объявлен с параметром String.Вы должны получить это с

UITester.class.getMethod( "printIfAvailable", String.class );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...