Действительно ли это возможно к патчу обезьяны в Java?

Хорошо, с чего начать?

Me относится к внутри текущего объекта.
Например, Форма, Класс или другой Объект. Me - сокращение и не работает как указатель в C.

Если вы действительно хотите скопировать свойства двух классов, вы должны либо реализовать .Copy Sub, либо сделать это вне класса.

Вы пробовали

Public Function CopyAnObject(ByVal Source as Object) as Object
      CopyAnObject = Source
End Function

Я не совсем понимаю, каким может быть использование, но похоже, что вы пытаетесь взломать что-то, что не стоит взламывать?

[117 ] Может ли ОП предоставить больше информации о того, чего он / она хочет достичь ?

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

21
задан AstroCB 30 August 2014 в 21:09
поделиться

7 ответов

Возможно, Вы могли использовать Аспектно-ориентированное программирование, чтобы захватить вызовы к той функции и возвратить Вашу собственную версию вместо этого?

Spring предлагает некоторую функциональность AOP, но существуют другие библиотеки, которые делают это также.

9
ответ дан 29 November 2019 в 21:50
поделиться

Одно ужасное решение состояло бы в том, чтобы поместить Вашу собственную реализацию DefaultWidget (с тем же FQCN) раньше Путь к классу, чем нормальная реализация. Это - ужасный взлом, но любой подход, о котором я могу думать, еще хуже.

7
ответ дан 29 November 2019 в 21:50
поделиться

Просто моя идея понятия,

Возможно, что используют AOP, с разработкой байт-кода путь, для введения аспекта к calculateHeight методу.

Затем можно включить Вам патч ThreadLocal или иначе переменной.

3
ответ дан 29 November 2019 в 21:50
поделиться

Только предложения я могу думать:

  1. Выройте через библиотеку API, чтобы видеть, существует ли некоторый способ переопределить значения по умолчанию и измерить. Калибровка может сбивать с толку в колебании (по крайней мере, мне), setMinimum, setMaximum, setdefault, setDefaultOnThursday.... Возможно, что существует путь. Если можно связаться с разработчиком (разработчиками) библиотеки, Вы могли бы найти ответ, который облегчит потребность в неприятном взламывании.

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

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

0
ответ дан 29 November 2019 в 21:50
поделиться

Объектно-ориентированный способ сделать это состоял бы в том, чтобы создать обертку, реализовав IWidget, делегировав все вызовы к фактическому виджету, кроме calculateHeight, чего-то как:

class MyWidget implements IWidget {
    private IWidget delegate;
    public MyWidget(IWidget d) {
        this.delegate = d;
    }
    public int calculateHeight() {
        // my implementation of calculate height
    }
    // for all other methods: {
    public Object foo(Object bar) {
        return delegate.foo(bar);
    }
}

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

Это также не зависит ни от какого клиента, пытающегося бросать IWidget назад в DefaultWidget...

0
ответ дан 29 November 2019 в 21:50
поделиться

cglib является библиотекой Java, которая может сделать некоторые вещи, подобные исправлению обезьяны - это может управлять байт-кодом во времени выполнения для изменения определенных поведений. Я не уверен, может ли это сделать точно, в чем Вы нуждаетесь, но это достойное внимания...

2
ответ дан 29 November 2019 в 21:50
поделиться

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

Лучшее решение, о котором я могу думать, состоит в том, чтобы разделить WindowDisplayFactory на подклассы, затем в createView подкласса () метод, сначала назвать super.createView (), затем изменить объект, возвращенный, чтобы полностью вывести виджет и заменить его экземпляром подкласса, который делает то, что Вы хотите. Но виджет используется для инициализации материала, таким образом, необходимо было бы пойти, изменяют всех тех.

Затем я думаю об использовании отражения о возвращенном объекте от createView () и попытка починить вещи тот путь, но снова, это является волосатым, потому что так много материала было инициализировано с виджетом. Я думаю, что попытался бы использовать тот подход, тем не менее, если бы было достаточно просто выровнять по ширине его по копированию и вставке.

Я буду наблюдать это плюс размышление, чтобы видеть, могу ли я придумать какие-либо другие идеи. Уверенное Отражение Java хорошо, но оно не может разбить динамический самоанализ, который я видел доступный на языках, таких как Perl и Python.

-1
ответ дан 29 November 2019 в 21:50
поделиться
Другие вопросы по тегам:

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