Использование методов в одном классе (classsA), в котором другой класс (classB) загружается с использованием api java отражения - PullRequest
2 голосов
/ 30 мая 2011

У меня есть следующее требование.Я загрузил набор классов [присутствует в jar-файле], используя Reflection в java.Теперь в загруженном классе я хочу вызвать определенные методы в классе загрузки.

Например, предположим, что есть класс A и класс B.Используя рефлексию, я загружаю класс B из класса A. Поэтому я могу использовать методы из класса B из класса A. Но я хочу использовать некоторые методы в классе A из класса B.

Ваша помощь в значительной степениоценил.

Спасибо ..

Ответы [ 4 ]

2 голосов
/ 30 мая 2011

Это похоже на неисправный дизайн. Попробуйте переосмыслить это. Ваша текущая настройка может быть решена путем применения шаблона singleton . Например:

abstract class SomeSingleton {

    private static SomeSingleton instance;

    public static void setInstance(SomeSingleton instance) {
        this.instance = instance;
    }

    public static SomeSingleton getInstance() {
        return instance;
    }

    public abstract void someMethod();
}

class ClassA extends SomeSingleton {

    public ClassA() {
        SomeSingleton.setInstance(this);
    }

    @Override
    public void someMethod() {
        System.out.println("some methid is called");
    }
}

class ClassB {

    public void aMethod() {
        SomeSingleton.getInstance().someMethod();
    }
}

Таким образом, ClassB не должен знать о ClassA. Он знает только об услуге. ClassA сообщает SomeSingleton, что он может предоставить услугу. - Так что все счастливы.

1 голос
/ 30 мая 2011

Вы можете настаивать на том, что ваш класс B (загруженный класс) имеет конструктор, который принимает A в качестве параметра:

class B {
    public B(A a) {
        // etc...
    }
}

А затем в своем коде отражения создайте экземпляр класса с помощью этого конструктора.Теперь B может делать все, что ему нужно, с помощью A. Вы можете создать новый экземпляр для конкретного конструктора, например:

Class<B> clazz = B.class;
clazz.getConstructor(new Class[] {A.class}).newInstance(a);
0 голосов
/ 30 мая 2011

Вы можете ТОЛЬКО сделать это, явно сообщив своему экземпляру classB о classA, например, позвонив по номеру

b.setA(this)

из a.

0 голосов
/ 30 мая 2011

Вы можете позволить classB реализовать метод, с помощью которого вы предоставляете экземпляр classA, а затем использовать этот экземпляр изнутри classB.

...