当Java类是Serializable的实例时

时间:2013-10-07 11:28:26

标签: java class junit instance 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 个答案:

答案 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()

(删除了错误的陈述)