Comments 6
Разве для Java существует реализация "Паблика Морозова"?
Теперь да.
И как это было сделано-то?
В классе 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
- Создать класс-наследник
//Другой пакет package ru.pflb.jmeter.samplers.wrapper; ... //Открытый класс-наследник public class WrapperHTTPHC4Impl extends HTTPHC4Impl implements ITailHTTPImpl{
- В классе-наследнике сделать метод 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.
TailSampler — паралельная отправка GET-запросов в Apache.JMeter