5

我想知道Java类什么时候是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

4 回答 4

6

你来做这件事:

File generatedFile = new File(...);

这创建了类的一个实例File

generatedFile.getClass()

这得到了Class对象的File对象,类型的对象Class<File>

File的文档描述了该类:

所有实现的接口:可序列化、可比较

如果您想实现解析 java 源文件以查看它是否实现 Serializable,您应该为此获取适当的工具,构建相关文件的抽象语法树,并从中提取信息。

或者你可以这样做,使用Class类的isAssignableFrom方法:

public boolean checkSerializable(Class<?> classToCheck) {
    return Serializable.class.isAssignableFrom(classToCheck);
}

然后检查类本身:

boolean isSerializable = checkSerializable(MyTestTableDto.class);
于 2013-10-07T11:37:38.007 回答
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 
{
  ...
}

它显然是可序列化的。

于 2013-10-07T11:34:56.390 回答
2

该声明

assertTrue( generatedFile.getClass() instanceof Serializable );

正在返回true,因为这将检查此生成的文件对象的运行时类是否是一个实例Serializable。并且类对象是可序列化的。

于 2013-10-07T11:35:55.313 回答
0

从您的代码中,以下调用将返回File对象的类实例,而不是MyTestTableDto

generatedFile.getClass()

(删除了错误的说法)

于 2013-10-07T11:38:45.430 回答