Java: выполнение метода произвольного класса в подпакете - PullRequest
1 голос
/ 05 ноября 2011

Рассмотрим эту структуру пакета

java.assignments
    Main.java
    java.assignments.lab1
        Exe1.java
    java.assignments.lab2
        Exe1.java
        Exe2.java
        Exe3.java
    java.assignments.lab3
        Exe1.java
        Exe2.java
        Exe3.java
        Exe4.java
and so on.
  1. Я хочу написать основной класс таким образом, чтобы, если я дам команду типа
    $ java java.assignments.Main exe java.assignments.lab2.Exe2 Программа должна выполнитьметод main хранится в lab2.Exe2.java

  2. Если я даю $ java java.assignments.Main src java.assignments.lab2.Exe2 Программа должна напечатать исходный код Exe2.java

    Я бы предпочел, чтобы исходный кодотображаются включенные комментарии, которые я пишу в программе.

  3. Если я даю $ java java.assignments.Main list В нем должны быть перечислены все пакеты и классы, содержащиеся в java.assignments

    Если ядать $ java java.assignments.Main list java.assignements.lab3 В нем должны быть перечислены все классы, содержащиеся в java.assignments.lab3

Возможно ли это?и если да, как мне этого добиться.

Материал, который я обнаружил до сих пор,

Я обнаружил, что могу динамически загружать и execute classes #1# из этого урока , но как мне достичь #2# displaying Source code и listing packages #3#

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

Я не рекомендую, чтобы вы начали изучать рефлексию;Я думаю, что это слишком сложно для новичка, и даже для некоторых программистов среднего уровня, а также слишком вовлечен.Я имею в виду, что даже если вы понимаете концепции и т. Д., Рефлексия - это большая тема, которая уводит вас далеко от выполнения конкретных вещей в программировании.

Поэтому я рекомендую это вместо:

Пусть все ваши классы «присваивания» реализуют интерфейс, который предписывает им определять метод, который вы затем собираетесь выполнить.Например, определите

public interface MainClass
{
  public void main(String[] args);
}

в классе с именем MainClass.java, а затем попросите каждое из ваших назначений реализовать этот интерфейс:

public class Lab2 implements MainClass

Т.е., просто поставьте «Implements MainClass» послеобъявление класса.

Если вы еще не знаете, вам нужно будет обработать массив строк «arguments», передаваемый методу main в java из командной строки.Именно здесь будут отображаться «exe» и имя класса, который пользователь хочет, чтобы вы выполнили.

Таким образом, ваш метод «main main» собирается протестировать первый аргумент, чтобы убедиться, что онравно "exe".Если это так, то 1. добавьте имя пакета (java.assignments) к имени вашего класса, создайте экземпляр класса с помощью Class.forName (), приведите его к Main и выполните метод main.Этот код будет выглядеть примерно так:

if (args[1].equalsIgnoreCase("exe"))   // it might be args[0], I can't remember
{
  String className = "java.assignments." + args[2];
  Object o = Class.forName(className);
  Main   mainMethodClass = (Main)o;
  o.main();
}

Class.forName () создает объект с указанным именем класса.Все, что вам нужно, это строка, которая является полностью определенным именем.

Строка после Class.forName () выше выполняет «приведение» недавно созданного объекта к интерфейсу Main.Если ваш объект не реализует (или не расширяет) Main, ваш код завершится ошибкой в ​​строке, которая выполняет приведение.Он говорит компилятору разрешить вам делать с ним те вещи, которые разрешены для класса, реализующего Main.

После этого объект становится таким же, как тот, с которым вы делали «новый», и вы можете вызывать любойметод, определенный на нем.

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

rc

1 голос
/ 05 ноября 2011

Вы не можете перечислить все классы, содержащиеся в пакете, согласно Можете ли вы найти все классы в пакете, используя отражение?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...