我想知道什么时候Java类是可序列化的实例。如我所知,类只有在实现可序列化接口时才是可序列化的。我试图使用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的实例。我的问题是为什么?我认为如果它没有实现可序列化,它就不应该是它的实例。我寻找答案,但什么也找不到。
发布于 2013-10-07 11:37:38
你这样做:
File generatedFile = new File(...);这创建了类实例 File。
generatedFile.getClass()这得到了Class对象的File对象,这是一个Class<File>类型的对象。
档案文件描述了这个类:
所有实现的接口:Serializable,可比较
如果您想要实现这样的目的,您需要解析一个java源文件,看看它是否实现了Serializable,您应该为此获得一个适当的工具,构建该文件的抽象语法树,并从中提取信息。
或者您可以这样做,使用isAssignableFrom类的班级方法:
public boolean checkSerializable(Class<?> classToCheck) {
return Serializable.class.isAssignableFrom(classToCheck);
}然后检查类本身:
boolean isSerializable = checkSerializable(MyTestTableDto.class);发布于 2013-10-07 11:34:56
这是因为您调用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-07 11:35:55
声明
assertTrue( generatedFile.getClass() instanceof Serializable );返回true,因为这将检查此generatedFile对象的运行时类是否是Serializable的实例。类对象是可序列化的。
https://stackoverflow.com/questions/19223688
复制相似问题