добавление функций в основной класс из другого класса с использованием конфигурации бина, если это возможно - PullRequest
1 голос
/ 04 июля 2011

Ну, я надеюсь, я буду достаточно ясно о том, чего я хочу достичь.Я прошу прощения, если я не могу полностью объяснить себя должным образом, или если я говорю чепуху, пожалуйста, держитесь за меня:)

Я пишу приложение red5 на Java.это просто означает, что у меня есть bean-компонент, указывающий на класс приложения моего основного класса, который называется Application .

У меня есть несколько классов, которые я хочу добавить и удалить как модули в своем приложении.

пример:

У меня есть два класса с именами 'A' и 'B', каждый из которых содержит открытую функцию testme ().Я хочу как-то настроить, что мой основной класс Application будет вызывать конструктор этих двух классов и что мой основной класс Application будет содержать функции Atestme () и Btestme (), которые будут вызывать соответствующую функцию testme () в соответствующем классе.Есть ли способ достичь такой цели без того, чтобы я вручную создал эти функции и вызвал соответствующую функцию в одном из классов?

Есть ли способ использовать конфигурацию бина для достижения такой цели?(Я хочу иметь возможность настроить добавление и удаление «модулей» с помощью конфигурации бина, если это возможно)

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

Ух ты, я вроде как потерялся, поэтому любая информация будет принята с благодарностью.

спасибо!

спасибо!

Ответы [ 2 ]

1 голос
/ 04 июля 2011

есть ли способ отловить, когда aDoTest () или bDoTest () вызывается в моем основном классе, и отловить его для вызова соответствующих функций?

Как насчет этого:

public class Application {
    public static void aDoTest() {
        doTest(new A());
    }

    public static void bDoTest() {
        doTest(new B());
    }

    private static doTest(Testable t) {
        t.testMe();
    }

    public static void main(String[] args) {
        aDoTest();
        bDoTest();
    }
}

public interface Testable {
    public void testMe();
}

public class A implements Testable {
    public void testMe() {
        // ...
    }
}

Если это не поможет, вам нужно уточнить свой вопрос.


Возможно, вы хотите перехватывать вызовы к несуществующим (то есть необъявленным или не реализованным) методам и превращать их в вызовы реальных методов. Если это так, вы можете отказаться от этой идеи. Java не позволит вам сделать это.

Самое близкое, что вы можете сделать, это создать новый класс во время выполнения с реализациями для этих методов:

  • Вы можете динамически генерировать исходный код, скомпилировать его и загрузить.
  • Вы можете использовать что-то вроде BCEL для создания файлов ".class" и загрузки их.
  • Используйте класс Proxy для создания динамической прокси-реализации некоторого интерфейса.

Но эти подходы все сложны и дороги. (Возможно, намного дороже, чем при использовании отражения, если только стоимость генерации не может быть амортизирована из-за огромного количества вызовов.)

1 голос
/ 04 июля 2011

В Java у вас есть методы , а не функции .

Написать интерфейс Testable.

public interface Testable {
    public void testme();
}

классы A и B должны реализовывать интерфейс Testable.

Тогда в вашем классе Application у вас есть метод

private static doTest(Testable t) {
    t.testme();
}

и у вас есть метод main ()

public static void main(String[] args) {
    doTest(new A());
    doTest(new B());
}
...