Как я могу проверить, доступен ли для класса l oop в классе? - PullRequest
0 голосов
/ 26 января 2020

Позвольте мне сначала объяснить пример использования.

Вариант использования: учащийся, обучающийся java, следует набору письменных инструкций и использует автоматические тесты (см. JUnit). Я хочу проверить, успешно ли они выполнили инструкцию.

Вещи, которые мне нужно выяснить, например, программно, это если в коде существует for l oop. Рассмотрим следующий код

class AClass {
    public static void main(String[] args){
         for(int i=1; i<11; i++){
              System.out.println("Count is: " + i);
         }
    }
}

Есть ли способ, с помощью которого, используя API отражения, я могу утверждать, что AClass содержит for(int i=1; i<11; i++)? Или любым другим способом?

Этот вопрос является примером. В идеале, может быть такой код, как if (x) {}, который я могу захотеть найти внутри класса.

Я не уверен, насколько это возможно.

Спасибо

1 Ответ

1 голос
/ 26 января 2020

Отражение, очевидно, здесь не поможет, потому что оно не разрешит доступ к внутренним частям метода (такие инструкции, как for, if, et c).

Из вопроса это похоже, вы работаете над какой-то системой обучения, которая обеспечит автоматическую c оценку / оценку работы студента

Так что, как я вижу, у вас есть два варианта:

  1. У вас также есть доступ к исходному коду, поэтому наличие for l oop может быть задачей для анализатора исходного кода, которая будет работать еще до Junit. Этакий дополнительный шаг, который проверит, что ученик не обманывает:
// OK - this will pass
public void methodToImplement() {  
  for(int i = 0; i < 3; i++) {
    System.out.println("Hello: " + i); 
  }
}

// this is an attempt to cheat that should be recognized:
public void methodToImplement() {  
  System.out.println("Hello: " + 0); 
  System.out.println("Hello: " + 1); 
  System.out.println("Hello: " + 2); 
}
Вы можете получить доступ к байт-коду, «прочитав» его (например, открыв файл * .class и прочитав в памяти набор инструкций, как будто это строка или что-то в этом роде) и найдя указанную c инструкцию, но затем вы не на самом деле нет гарантии, что компилятор не будет выполнять какую-либо оптимизацию и намеренно исключит l oop (хорошо, в этом примере это может не произойти, я не очень разбираюсь в оптимизации компилятора, но вы получить представление в общем).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...