Как реализовать прокси объекта или прокси класса в Java?

У меня есть требование расширить файл .class в моем проекте, и мне нужно переопределить простой метод. Предположим, у меня есть класс A, который находится в каком-то пакете .jar. Теперь я хочу переопределить метод test() класса A. Я сделал это, создав подкласс B из A и переопределив его. Теперь в моем пакете приложений (это .jar) объект создается для класса A. Этот объект вызывает метод класса A. Но я хочу сделать вызов метода класса B.

Моя идея состоит в том, чтобы проксировать создание объекта во всем приложении. Всякий раз, когда в это время создается объект класса A, я хочу, чтобы какая-то конфигурация создавала объект класса B и передавалась инициации класса A.

Кто-нибудь, пожалуйста, помогите мне реализовать этот тип механизма.


person Harun Pathan    schedule 16.07.2015    source источник


Ответы (2)


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

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

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

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

person Davide Lorenzo MARINO    schedule 16.07.2015
comment
может у вас есть простой рабочий пример на фабрике весенних бобов для вышеуказанной идеи - person Harun Pathan; 17.07.2015

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

package testA;

public class A 
{

    public static void main(String[] args) 
    {
        System.out.println("Hello World!");
    }

    public String aMethod(){
        System.out.println("Calling aMethod");
        return "aMethod";
    }
}



package testB;
import testA.*;

public class B extends A
{

    public static void main(String[] args) 
    {
        System.out.println("Hello World!");
        A aClass = new B();
        aClass.aMethod();
        ((B)aClass).bMethod();
    }

    public String bMethod(){
        System.out.println("calling B method");
        return "bMethod";
    }
}
person Gagan Kumar    schedule 20.11.2016