Когда класс Java является экземпляром Serializable
Интересно, когда Java Class является экземпляром Serializable. Как я знаю, класс является сериализуемым, только если он реализует интерфейс Serializable. Я пытаюсь использовать junit для генерации класса сущности (из какого-то шаблона) и проверки, сериализуем ли он.
Мой сгенерированный класс (который НЕ реализует Serializable) выглядит так:
package test;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.annotation.Generated;
import javax.persistence.Id;
@Entity
@Table( name = MyTestTableDto.TABLE_NAME )
public class MyTestTableDto
{
public static final String TABLE_NAME = "MY_TEST_TABLE";
public static final String COLUMN_MY_ID_FIELD = "MY_ID_FIELD";
public static final String FIELD_MY_ID_FIELD = "myIdField";
@Id
@Column( nullable = true, length = 14, name = COLUMN_MY_ID_FIELD )
private Long myIdField;
public Long getMyIdField()
{
return myIdField;
}
public void setMyIdField( Long aMyIdField )
{
this.myIdField = aMyIdField;
}
}
Тест ниже:
File generatedFile = new File( GEN_OUTPUT_DIR, File.separator + className + ".java" );
assertTrue( generatedFile.getClass() instanceof Serializable ); //returns true
Результат предполагает, что мой сгенерированный класс является экземпляром Serializable. У меня вопрос почему? Я думаю, что если он не реализует Serializable, он не должен быть его примером. Я искал ответ, но ничего не мог найти.
4 ответа
Ты делаешь это:
File generatedFile = new File(...);
Это создало экземпляр класса File
,
generatedFile.getClass()
Это получил Class
объект для File
объект, объект типа Class<File>
Документация File описывает класс:
Все реализованные интерфейсы: Сериализуемый, Сравнимый
Если вы хотите добиться того, что вы хотите проанализировать исходный файл Java, чтобы увидеть, реализует ли он Serializable, вы должны получить соответствующий инструмент для этого, построить абстрактное синтаксическое дерево рассматриваемого файла и извлечь из него информацию.
Или вы можете просто сделать это, используя метод isAssignableFrom класса Class:
public boolean checkSerializable(Class<?> classToCheck) {
return Serializable.class.isAssignableFrom(classToCheck);
}
А затем проверьте сам класс:
boolean isSerializable = checkSerializable(MyTestTableDto.class);
Это потому, что вы вызываете instanceof для объекта Class, который является сериализуемым.
getClass возвращает Class<T>
объект, где T - тип класса. Потому что класс определяется как
public final
class Class<T> implements java.io.Serializable,
java.lang.reflect.GenericDeclaration,
java.lang.reflect.Type,
java.lang.reflect.AnnotatedElement
{
...
}
это явно сериализуемый.
Заявление
assertTrue( generatedFile.getClass() instanceof Serializable );
возвращается true
, потому что это проверит, является ли класс времени выполнения данного объекта generateFile экземпляром Serializable
или нет. И объект класса является сериализуемым.
Из вашего кода приведенный ниже вызов вернет экземпляр класса для File
объект, а не MyTestTableDto
generatedFile.getClass()
(удалил неправильное утверждение)