我想知道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,它不应该是它的实例。我搜索了一个答案,但我找不到任何东西。
答案 0 :(得分:6)
你这样做:
File generatedFile = new File(...);
这创建了类File
的实例。
generatedFile.getClass()
这得到了Class
对象的File
对象,类型为Class<File>
的对象
documentation of File描述了这个类:
所有已实施的界面:可序列化,可比较
如果你想实现它想要解析一个java源文件以查看它是否实现了Serializable,你应该为此获得一个合适的工具,构建相关文件的抽象语法树,并提取信息从那里。
或者你可以这样做,使用isAssignableFrom类的Class方法:
public boolean checkSerializable(Class<?> classToCheck) {
return Serializable.class.isAssignableFrom(classToCheck);
}
然后检查班级本身:
boolean isSerializable = checkSerializable(MyTestTableDto.class);
答案 1 :(得分:3)
这是因为你在Class对象上调用了instanceof,它是可序列化的。
getClass返回一个Class<T>
对象,其中T是类的类型。因为Class被定义为
public final
class Class<T> implements java.io.Serializable,
java.lang.reflect.GenericDeclaration,
java.lang.reflect.Type,
java.lang.reflect.AnnotatedElement
{
...
}
它显然是可序列化的。
答案 2 :(得分:2)
声明
assertTrue( generatedFile.getClass() instanceof Serializable );
返回true
,因为这将检查此generatedFile对象的运行时类是否是Serializable
的实例。并且类对象是可序列化的。
答案 3 :(得分:0)
从您的代码中,以下调用将返回File
对象的Class实例,而不是MyTestTableDto
generatedFile.getClass()
(删除了错误的陈述)