Comments 6

В классе HTTPHC4Impl есть защищённый метод sample:


//Пакет
package org.apache.jmeter.protocol.http.sampler;
...
//Открытый класс
public class HTTPHC4Impl extends HTTPHCAbstractImpl {
...
    //Закрытый метод
    @Override
    protected HTTPSampleResult sample(URL url, String method,
              boolean areFollowingRedirect, int frameDepth) {

https://github.com/apache/jmeter/blob/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java#L326
А также ряд других методов, которые разработчики защитили.


Вызовем этот код в другом классе:
https://github.com/pflb/Jmeter.Plugin.TailSampler/blob/master/ru.pflb.jmeter.samplers.TailSampler/src/ru/pflb/jmeter/samplers/wrapper/WrapperHTTPHC4Impl.java#L19


  1. Создать класс-наследник
    //Другой пакет
    package ru.pflb.jmeter.samplers.wrapper;
    ...
    //Открытый класс-наследник
    public class WrapperHTTPHC4Impl extends HTTPHC4Impl implements ITailHTTPImpl{
  2. В классе-наследнике сделать метод sample публичным:
    //Открытый метод-обёртка для вызова закрытого метода
    @Override
    public HTTPSampleResult sampleTail(URL url, String method, boolean areFollowingRedirect, int frameDepth) {
        return super.sample(url, method, areFollowingRedirect, frameDepth);
    }

Теперь можно вызывать protected метод класса из пакета org.apache.jmeter.protocol.http.sampler в классе из пакета ru.pflb.jmeter.samplers.wrapper. Так как класс WrapperHTTPHC4Impl лишь делает закрытые методы другого класса открытыми, описал подход, как применение паттерна "Паблик Морозов".


Конечно, раскрываются не все методы. А лишь часть. И вызывается метод открытого класса, что упрощает реализацию. Не знаю как бы поступил, если ты класс HTTPHC4Impl не был публичным.

Ну так ведь вы создаете новый объект-наследник, а не дергаете методы существующего. Это нормальное расширение, а не Паблик Морозов.


Только я бы не стал такое расширение объявлять как public.

Спасибо, Павел. Убрал из текста статьи упоминание антипаттерна. Учту позже рекомендацию по отказу от public.

Only those users with full accounts are able to leave comments. Log in, please.