发表于: 2017-12-20 23:50:14

2 646


今天完成的事情:完成部分实名接口 

复习了一下序列化的知识 java进行序列化、反序列化时,虚拟机会首先试图调用对象里的writeObject和readObject方法,进行用户自定义的序列化和反序列化。如果没有这 样的方法,那么默认调用的是ObjectOutputStream的defaultWriteObject以及ObjectInputStream的 defaultReadObject方法。换言之,利用自定义的writeObject方法和readObject方法,用户可以自己控制序列化和反序列 化的过程。

这里就需要transient 关键字 目的就是无法使用默认的序列化 

writeObject和readObject的通常用法:

先通过defaultWriteObject和defaultReadObject方法序列化、反序列化对象,然后在文件结尾追加需要额外序列化的内容/从文件的结尾读取额外需要读取的内容。

明天计划的事情:完成实名接口

遇到的问题:测试了一下 验证的方法有bug

发现 是当检测为错时 没有return 导致程序继续执行了 

然后看了一下java的编码 

Java的class文件采用utf8的编码方式,JVM运行时采用utf16,Java的字符串是unicode编码的。

收获:系统学习了一下反射的概念

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制

常用的方法有 getDeclaredField

getDeclaredField是可以获取一个类的所有字段. 
getField只能获取类的public 字段.
 看下代码

public Field getDeclaredField(String name)  

       throws NoSuchFieldException, SecurityException {  

       checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());  

       Field field = searchFields(privateGetDeclaredFields(false), name);  

       if (field == null) {  

           throw new NoSuchFieldException(name);  

       }  

       return field;  

   }  

private Field getField0(String name) throws NoSuchFieldException {  

       Field res = null;  

       // Search declared public fields  

       if ((res = searchFields(privateGetDeclaredFields(true), name)) != null) {  

           return res;        }  

getField其实调用的是getDeclaredField 他们最后都调用了searchFields. 
不过getDeclaredField传入的是privateGetDeclaredFields(false), 
getField传入的是privateGetDeclaredFields(true),
 再看这个privateGetDeclaredFields

private Field[] privateGetDeclaredFields(boolean publicOnly) {  

       checkInitted();  

       Field[] res = null;  

       if (useCaches) {  

           clearCachesOnClassRedefinition();  

           if (publicOnly) {  

               if (declaredPublicFields != null) {  

                   res = (Field[]) declaredPublicFields.get();  

               }  

           } else {  

               if (declaredFields != null) {  

                   res = (Field[]) declaredFields.get();  

               }             }  

看到传入条件为true的时候使用的是declaredPublicFields,意思是public字段 

为false的时候使用的是declaredFields. 然而这两个最后居然是

private native Field[]       getDeclaredFields0(boolean publicOnly); 

这里接触了一下native 方法 简单理解就是java代码调用非java代码的接口 

native方法非常有用,因为它有效地扩充了jvm.事实上,我们所写的java代码已经用到了本地方法,在sun的java的并发(多线程)的机制实现中,许多与操作系统的接触点都用到了本地方法,这使得java程序能够超越java运行时的界限。有了本地方法,java程序可以做任何应用层次的任务。 或者更快


返回列表 返回列表
评论

    分享到