Java + Reflection: вызов метода при доступе к переменной. Является ли это возможным? - PullRequest
1 голос
/ 22 октября 2010

Мне было интересно, возможно ли, используя отражение или что-то подобное, вызывать метод всякий раз, когда к переменной обращаются в режиме чтения или записи.В двух словах, моя цель похожа на поведение свойств C #.

Пример: скажем, у меня есть два класса A и B ...

public class A{
    public int field;

    public void foo(){ System.out.println("Field modified");}
}

public class B{
    public void bar(A a){
        a.field = 1;
    }
}

... и я хочувыполнять метод A.foo () всякий раз, когда пишется a.field.

Это достижимо в Java?

Заранее спасибо

ps Я знаю, что хорошоПрактики программирования предлагают использовать геттер и сеттер.Мне просто нужно знать, возможно ли то, что я хочу сделать.

ac

Ответы [ 3 ]

7 голосов
/ 22 октября 2010

Не с помощью отражения - отражение просто позволяет получить доступ к статической информации о классах / полях / и т. Д. Во время выполнения.

Аспектно-ориентированное программирование - это больше, чем вы думаете - это позволяет вам вводить небольшие кусочки кода (называемые «советами») в определенные моменты исходного кода (например, перед запуском метода, когда поле установлено и т. д.). Это почти наверняка позволит вам сделать то, что вы ищете.

Слово предупреждения, хотя - как вы, похоже, поняли, вряд ли будет хорошей идеей полагаться на аспекты для вашей общей логики, так как с ними очень трудно рассуждать и точно определять, что произойдет, когда ( По определению, они нарушают ментальную модель по умолчанию, которая вызывает метод foo (), что означает, что управление переходит непосредственно к этому методу). AOP отлично для таких вещей, как ведение журнала или отладка, поскольку позволяет писать небольшие кусочки кода, которые затрагивают множество сквозных задач без особых усилий, и не требуют, чтобы вы изменяли код базовое приложение. Ваш совет может быть внесен по мере необходимости и просто пропущен, когда не требуется.

3 голосов
/ 22 октября 2010

Мне было интересно, возможно ли, используя отражение или что-то подобное, вызывать метод всякий раз, когда к переменной обращаются в режиме чтения или записи.

Да.Если вы правильно инкапсулируете свои данные, используя методы getter и setter, вы можете поместить такой код в эти методы или переопределить эти методы в подклассе.

(теперь я видел ваши пс) - Нет, нет никакого способарешения этого с помощью отражения.Если бы меня попросили (заставили?) Решить эту проблему, я бы написал свой собственный загрузчик классов, возможно, с использованием фреймворка ASM , и заменил бы каждую инструкцию get-field / set-field правильными вызовами getter /методы установки.

На самом деле для этого есть запись FAQ с решением:

0 голосов
/ 22 октября 2010

AFAIK, вы не можете сделать это на Java.Как вы сказали, используйте геттеры и сеттеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...