Можно ли использовать AOP / AspectJ для воздействия на StringBuilder

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

Если вам известен порядок байтов, в котором вы хотите поговорить и кодировать / декодировать соответственно, вы можете использовать пакет encoding/binary для этого: https://godoc.org/encoding/binary#ByteOrder

Если вам действительно нужно полагаться на порядок байтов хоста, вы можете ударить головой по дизайну анти-шаблона, который вы следует стараться избегать, если это возможно: https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html

Также здесь говорится о энергичном обсуждении golang- орехи по этой теме, с мнениями, высказанными по обе стороны дискуссии: https://groups.google.com/forum/#!topic/golang-nuts/3GEzwKfRRQw

В этой электронной почте есть предложение Russ Cox просто статически определить желаемый порядок байтов (или порядок байтов хоста) с использованием ограничений сборки:

В течение нескольких месяцев наш код имел:

var hbo = binary.LittleEndian // hack - нам нужен порядок байтов хоста!

, поэтому мы n использовать encoding.Binary для чтения вещей.

Поместите это в файл с именем byteorder_amd64.go, и он перестает быть взломанным. Это не должно быть в стандартной библиотеке.

Надеюсь, что это поможет ...

1
задан kriegaex 17 February 2019 в 02:06
поделиться

1 ответ

Да, вы можете. Я не знаком с синтаксисом, который вы используете в настоящее время. Но с AspectJ было бы что-то вроде:

public aspect InterceptStringBuilders {

    StringBuilder around(StringBuilder target) :
                  call(public StringBuilder append(String)) &&
                  !within(InterceptStringBuilders) &&
                  target(target)
                  {
                      if(target.length() == 0)
                      {
                         target.append("!!");
                      }
                      else if(target.length() == 1 || target.charAt(0) != '!' || target.charAt(1) != '!')
                      {
                         target.insert(0, "!!");
                      }

                      return proceed(target);
                 }
}  

Точка соединения - public StringBuilder append(String), и вам нужен pointcut target, чтобы выставить StringBuilder, чтобы вы могли принудительно установить, что он начинается с «!!». Кроме того, вам также нужен pointcut !within(interceptStringBuilders), чтобы гарантировать, что вы не перехватывает вызовы Stringbuilder из самого аспекта.

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

"call(public StringBuilder append(String) && !within(LoggingAspect) && target(StringBuilder)"
0
ответ дан dreamcrash 17 February 2019 в 02:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: