栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

APIJSON(四:AbstractObjectParser源码阅读)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

APIJSON(四:AbstractObjectParser源码阅读)

APIJSON(四:AbstractObjectParser源码阅读(1))
    • 1.类名
      • (1)抽象类相关知识
      • (2)接口相关知识
      • (3)接口ObjectParser
    • 2.AbstractParser
    • 3.成员变量及构造函数

1.类名

首先观察一下类名

public abstract class AbstractObjectParser implements ObjectParser 

可以发现这是一个抽象类,并继承了一个接口。

(1)抽象类相关知识

1、用abstract关键字来表达的类,其表达形式为:(public)abstract class 类名{}

2、抽象类不能被实例化,也就是说我们没法直接new 一个抽象类。抽象类本身就代表了一个类型,无法
确定为一个具体的对象,所以不能实例化就合乎情理了,只能有它的继承类实例化。

3、抽象类虽然不能被实例化,但有自己的构造方法。(当然如果我们不写,编译器会自动默认一个无参构造方法)。

4、抽象类与接口(interface)有很大的不同之处,接口中不能有实例方法去实现业务逻辑,而抽象类
中可以有实例方法,并实现业务逻辑,比如我们可以在抽象类中创建和销毁一个线程池。

抽象类有什么好处呢?
1、由于抽象类不能被实例化,最大的好处就是通过方法的覆盖来实现多态的属性。也就是运行期绑定
2、抽象类将事物的共性的东西提取出来,由子类继承去实现,代码易扩展、易维护。

java关键字abstract(抽象)详解

(2)接口相关知识

注意到抽象类AbstractObjectParser是继承了一个接口的

抽象类接口
使用关键字abstract修饰使用关键字interface修饰
使用关键字extends实现继承,可以只实现一部分方法,一部分不实现,或者不实现也可以implements来实现接口,实现接口必须实现里面都有的方法,接口支持多继承
抽象类里面的方法可以是空实现,可以默认实现,但是必须要带{}接口里面的方法都没有实现体,也就是{}
抽象类中可以有具体的方法以及属性,也可以有静态代码块,静态成员变量接口里面不能有普通成员变量,必须都是不可变的final成员变量,而且所有的成员变量都必须是public
抽象类里面的方法可以是public,protect,private接口的方法只能是public或者无修饰符,所有的private修饰都是会报错的
如果有改动,添加新的方法,可以直接在抽象类中实现默认的即可,也可以在实现类中实现接口增加新方法必须在接口中声明,然后在实现类中进行实现
抽象类不能直接创建对象接口也不能直接创建对象 ,可以赋予实现类的对象
抽象类可以有main方法,而且我们可以直接运行,抽象类也可以有构造器接口不能有main方法,接口不能有构造器

JAVA 接口与抽象类的异同

(3)接口ObjectParser
public interface ObjectParser {

   String getParentPath();
   
   ObjectParser setParentPath(String parentPath);
   
   ObjectParser parse(String name, boolean isReuse) throws Exception;
   
   public JSONObject parseResponse(RequestMethod method, String table, String alias, JSONObject request, List joinList, boolean isProcedure) throws Exception;
   
   public JSONObject parseResponse(SQLConfig config, boolean isProcedure) throws Exception;
   
   boolean onParse(@NotNull String key, @NotNull Object value) throws Exception;
   
   JSON onChildParse(int index, String key, JSONObject value) throws Exception;
   
   Object onReferenceParse(@NotNull String path);
   
   void onPUTArrayParse(@NotNull String key, @NotNull JSONArray array) throws Exception;
   
   void onTableArrayParse(@NotNull String key, @NotNull JSONArray array) throws Exception;
   
   ObjectParser setSQLConfig() throws Exception;
   
  
   ObjectParser setSQLConfig(int count, int page, int position) throws Exception;
   
   ObjectParser executeSQL() throws Exception;
   
   JSONObject onSQLExecute() throws Exception;
   
   JSONObject response() throws Exception;

   void onFunctionResponse(String type) throws Exception;

   void onChildResponse() throws Exception;
   

   SQLConfig newSQLConfig(boolean isProcedure) throws Exception;
   
   SQLConfig newSQLConfig(RequestMethod method, String table, String alias, JSONObject request, List joinList, boolean isProcedure) throws Exception;
   void onComplete();
   
   void recycle();


   ObjectParser setMethod(RequestMethod method);
   
   RequestMethod getMethod();

   boolean isTable();
   
   String getPath();
   
   String getTable();
   
   String getAlias();
   
   SQLConfig getArrayConfig();

   SQLConfig getSQLConfig();
   
   JSONObject getResponse();
   
   JSONObject getSqlRequest();
   
   JSONObject getSqlReponse();

   Map getCustomMap();
   
   Map> getFunctionMap();
   
   Map getChildMap();


}

在这其中,抛开get和set相关成员属性的抽象方法不看(毕竟也没啥好解释的)。根据官方的注释——

parse相关的都是解析相关的。

只不过解析的内容根据输入有所差别而已。就比如说

parseResponse是调用 parser 的 sqlExecutor 来解析结果

onParse是解析普通成员

onChildParse是解析赋值引用

recycle是用来回收内存的

在接口上大多数方法只能看个大概,具体起什么作用我也暂时不知,希望能在继承其的抽象类中得到进一步的解答。

2.AbstractParser

首先我们可以看到这两行函数。

protected AbstractParser parser;
public AbstractObjectParser setParser(AbstractParser parser) {
   this.parser = parser;
   return this;
}

其中注意到创建了一个AbstractParser(范型)类的对象parser。
而此类的主要作用为将request请求解析成为JSON对象,而AbstractObjectParser类的功能也是对该对象进行解析。

3.成员变量及构造函数

接下来是一连串的成员变量的定义。

protected JSONObject request;//不用final是为了recycle
protected String parentPath;//不用final是为了recycle
protected SQLConfig arrayConfig;//不用final是为了recycle
protected boolean isSubquery;

protected final int type;
protected final String arrayTable;
protected final List joinList;
protected final boolean isTable;
protected final boolean isArrayMainTable;

protected final boolean tri;

protected final boolean drop;

咱们可以对其中的成员变量的两个陌生的类进行分析——

首先是JSONObject,点进去可以看见它是继承自com.alibaba.fastjson.JSONObject

public class JSONObject extends com.alibaba.fastjson.JSONObject

也就是说这是对这个的一定程度上的改写,抛开细节不谈,我们去看一下com.alibaba.fastjson.JSONObject

首先,介绍一下fastjson。fastjson是由alibaba开源的一套json处理器。与其他json处理器(如Gson,Jackson等)和其他的Java对象序列化反序列化方式相比,有比较明显的性能优势。

public class JSONObject extends JSON implements Map, Cloneable, Serializable, InvocationHandler

这个包里面最主要也是最常用的两个类是 JSON JSonObject 这两个类也都是内部使用的是final map 来实现的。构造的时候可以传入一个ordered。来确定使用linkedHashMap还是HashMap。

JSonObject 实现了Map 接口。

然后是SQLConfig

这其实相当通俗易懂,就是数据库相关配置的信息(类如其名了属于是)

咱们接着往下看,就是一个AbstractObjectParser构造函数了

public AbstractObjectParser(@NotNull JSonObject request, String parentPath, SQLConfig arrayConfig
      , boolean isSubquery, boolean isTable, boolean isArrayMainTable)

里面基本用到了上述的大多数成员变量,其中特别注意到request不能为空。

具体如下——

public AbstractObjectParser(@NotNull JSONObject request, String parentPath, SQLConfig arrayConfig
      , boolean isSubquery, boolean isTable, boolean isArrayMainTable) throws Exception {
   if (request == null) {
      throw new IllegalArgumentException(TAG + ".ObjectParser  request == null!!!");
   }
   this.request = request;
   this.parentPath = parentPath;

   this.arrayConfig = arrayConfig;
   this.isSubquery = isSubquery;

   this.type = arrayConfig == null ? 0 : arrayConfig.getType();
   this.arrayTable = arrayConfig == null ? null : arrayConfig.getTable();
   this.joinList = arrayConfig == null ? null : arrayConfig.getJoinList();

   this.isTable = isTable; // apijson.JSONObject.isTableKey(table);
   this.isArrayMainTable = isArrayMainTable; // isSubquery == false && this.isTable && this.type == SQLConfig.TYPE_ITEM_CHILD_0 && RequestMethod.isGetMethod(method, true);
   //    this.isReuse = isReuse; // isArrayMainTable && arrayConfig != null && arrayConfig.getPosition() > 0;

   this.objectCount = 0;
   this.arrayCount = 0;

   boolean isEmpty = request.isEmpty();//empty有效 User:{}
   if (isEmpty) {
      this.tri = false;
      this.drop = false;
   }
   else {
      this.tri = request.getBooleanValue(KEY_TRY);
      this.drop = request.getBooleanValue(KEY_DROP);

      request.remove(KEY_TRY);
      request.remove(KEY_DROP);
   }

}
报错中的TAG定义在了最前面private static final String TAG = "AbstractObjectParser";
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/342909.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号