当Java类是Serializable的实例时

dzu*_*uma 5 java junit class 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

测试如下:

 File generatedFile = new File( GEN_OUTPUT_DIR, File.separator + className + ".java" );

 assertTrue( generatedFile.getClass() instanceof Serializable ); //returns true
Run Code Online (Sandbox Code Playgroud)

结果表明我生成的类是Serializable的实例.我的问题是为什么?我认为如果它没有实现Serializable,它不应该是它的实例.我找了一个答案,但我找不到任何东西.

ppe*_*rka 6

你做这个:

File generatedFile = new File(...);
Run Code Online (Sandbox Code Playgroud)

这创建了一个类的实例File.

generatedFile.getClass()
Run Code Online (Sandbox Code Playgroud)

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

File文档描述了这个类:

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

如果你想实现它想要解析一个java源文件以查看它是否实现了Serializable,你应该为此获得一个合适的工具,构建相关文件的抽象语法树,并从那里提取信息.

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

public boolean checkSerializable(Class<?> classToCheck) {
    return Serializable.class.isAssignableFrom(classToCheck);
}
Run Code Online (Sandbox Code Playgroud)

然后查看课程本身:

boolean isSerializable = checkSerializable(MyTestTableDto.class);
Run Code Online (Sandbox Code Playgroud)