Я решил FastClasspathScanner решить эту проблему. Он обрабатывает много разных типов задач сканирования классов, имеет простой API, работает со многими различными классами ClassLoaders и classpath, тщательно распараллелен и оптимизирован для высокоскоростного и низкого потребления памяти. Он может даже генерировать визуализацию GraphViz графа классов, показывая, как классы связаны друг с другом.
Для вашего первоначального вопроса о поиске всех классов или интерфейсов в данном пакете вы можете сделать:
List classNames = new FastClasspathScanner("com.mypackage").scan()
.getNamesOfAllClasses();
Существует много возможных вариантов: см. документацию (см. выше) для полной информации.
Как кто-то еще отметил, глава 11 Josh Bloch , Эффективный Java является необходимым ресурсом на Сериализации Java.
Пара точек из той главы, подходящей для Вашего вопроса:
я записал быстрый пример ниже иллюстрирования этого.
class MyClass extends MyClass2 implements Serializable{
public MyClass(int quantity) {
setNonSerializableProperty(new NonSerializableClass(quantity));
}
private void writeObject(java.io.ObjectOutputStream out)
throws IOException{
// note, here we don't need out.defaultWriteObject(); because
// MyClass has no other state to serialize
out.writeInt(super.getNonSerializableProperty().getQuantity());
}
private void readObject(java.io.ObjectInputStream in)
throws IOException {
// note, here we don't need in.defaultReadObject();
// because MyClass has no other state to deserialize
super.setNonSerializableProperty(new NonSerializableClass(in.readInt()));
}
}
/* this class must have no-arg constructor accessible to MyClass */
class MyClass2 {
/* this property must be gettable/settable by MyClass. It cannot be final, therefore. */
private NonSerializableClass nonSerializableProperty;
public void setNonSerializableProperty(NonSerializableClass nonSerializableProperty) {
this.nonSerializableProperty = nonSerializableProperty;
}
public NonSerializableClass getNonSerializableProperty() {
return nonSerializableProperty;
}
}
class NonSerializableClass{
private final int quantity;
public NonSerializableClass(int quantity){
this.quantity = quantity;
}
public int getQuantity() {
return quantity;
}
}
Если можно изменить MyClass2, самый легкий способ обратиться, это, объявляют переходный процесс свойства.
MyClass2 является просто интерфейсом так techinicaly, он не имеет никаких свойств, только методы. Это сказанное, если у Вас есть переменные экземпляра, которые самостоятельно не serializeable единственный способ, которым я знаю об обойти его, должно объявить те поля переходный процесс.
исключая:
private transient Foo foo;
, Когда Вы объявите полевой переходный процесс, это будет проигнорировано во время процесса сериализации и десериализации. Следует иметь в виду, что при десериализации объекта с переходным полем, которым всегда будет значение поля, это - значение по умолчанию (обычно пустой указатель.)
Примечание можно также переопределить readResolve () метод класса для инициализации переходных полей на основе другого состояния системы.
Зависит, почему тот член MyClass2 не является сериализуемым.
, Если существует некоторое серьезное основание, почему MyClass2 не может быть представлен в сериализированной форме, тогда возможности хороши, та же причина относится к MyClass, так как это - подкласс.
может быть возможно записать пользовательскую сериализированную форму для MyClass путем реализации readObject и writeObject таким способом, которым состояние данных экземпляра MyClass2 в MyClass может быть соответственно воссоздано от сериализированных данных. Это было бы способом пойти, если API MyClass2 фиксируется, и Вы не можете добавить сериализуемый.
, Но сначала необходимо выяснить, почему MyClass2 не является сериализуемым, и, возможно, измените его.
Необходимо будет реализовать writeObject()
и readObject()
и сделать ручную сериализацию/десериализацию тех полей. Посмотрите javadoc страницу для java.io.Serializable
для деталей. У Josh Bloch Эффективный Java также есть некоторые хорошие главы по реализации устойчивой и безопасной сериализации.
Несколько возможностей появились, и я возобновляю их здесь:
Можно запустить путем изучения переходный процесс ключевое слово, которое отмечает поля как не часть постоянного состояния объекта.
Полезный подход для сериализации экземпляров несериализуемых классов (или по крайней мере подклассы) известен Последовательный Прокси. По существу Вы реализуете writeReplace для возврата экземпляра совершенно другого сериализуемого класса, который реализует readResolve для возврата копии исходного объекта. Я записал пример сериализации java.awt. BasicStroke на Usenet
XStream является большой библиотекой для того, чтобы сделать быстрый Java к сериализации XML для любого объекта, неважно, если это является сериализуемым или нет. Даже если целевой формат XML не подходит Вам, можно использовать исходный код, чтобы изучить, как сделать это.