Сначала немного предыстории. Я изучаю возможность реализовать ActiveRecord Ruby на Java настолько четко и лаконично, насколько это возможно. Для этого мне нужно разрешить следующий тип вызова метода:
Person person = Person.find("name", "Mike");
Что бы решить что-то вроде:
ActiveRecord.find(Person.class, "name", "Mike");
План состоит в том, чтобы Person расширил ActiveRecord, который имел бы статический метод поиска с двумя параметрами (столбец, значение). Этот метод должен знать, что он вызывается через Person.find, а не через другой доменный класс, такой как Car.find, и вызывать метод find(Class, String, Object) для выполнения фактической операции.
Проблема, с которой я сталкиваюсь, заключается в том, чтобы выяснить, через какой дочерний класс ActiveRecord был вызван метод статического поиска (два параметра). Ниже приведен простой тестовый пример:
public class A {
public static void testMethod() {
// need to know whether A.testMethod(), B.testMethod(), or C.testMethod() was called
}
}
public class B extends A { }
public class C extends A { }
public class Runner {
public static void main(String[] args) {
A.testMethod();
B.testMethod();
C.testMethod();
}
}
Решения, найденные до сих пор, связаны со временем загрузки или компиляции с использованием аспекта J. Это потребует размещения перехватчика вызовов в методе testMethod() в A и выяснения того, какая сигнатура использовалась для его вызова. Я полностью за плетение во время загрузки, но настройка этой настройки (через аргументы виртуальной машины) немного сложна.
Есть ли более простое решение?
Возможно ли это вообще в java или это нужно сделать в чем-то вроде groovy/ruby/python?
Будет ли в целом подход с использованием чего-то вроде ActiveRecord.find для статических нагрузок и Person.save для экземпляров?
ActiveRecordбазовый класс, я больше не смогу расширять свой собственный базовый класс, а это значит, что я больше не смогу иерархически моделировать свой домен или выполнять рефакторинг в целях сохранения. Интерфейсов и аннотаций OTOH много: рассмотрите возможность использования одного из них. (Или миксины, если вы все равно идете по маршруту плетения байт-кода.) - person Jörg W Mittag   schedule 07.12.2009