嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2015-12-11 2982 次浏览 标签 : JavaYar

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

鸟哥的yar_packager.c中首先定义了一个结构体,初始化的时候会把各个yar_packager_t注册到**packagers数组中。

struct _yar_packagers_list {
	unsigned int size;
	unsigned int num;
	yar_packager_t **packagers;
} yar_packagers_list;
typedef struct _yar_packager {
	const char *name;
	int  (*pack) (struct _yar_packager *self, zval *pzval, smart_str *buf, char **msg TSRMLS_DC);
	zval * (*unpack) (struct _yar_packager *self, char *content, size_t len, char **msg TSRMLS_DC);
} yar_packager_t;

然后通过传入的nameyar_packager_tname做比较,相同则返回该实例

PHP_YAR_API yar_packager_t * php_yar_packager_get(char *name, int nlen TSRMLS_DC) /* {{{ */ {
    int i = 0;
	for (;i<yar_packagers_list.num;i++) {
		if (strncasecmp(yar_packagers_list.packagers[i]->name, name, nlen) == 0) {
			return yar_packagers_list.packagers[i];
		}
	}

	return NULL;
} /* }}} */

改写成 java 版本,顺便自己做个笔记

abstract public class YarPackager {

    public static final String     YAR_PACKAGER_PHP     = "PHP";
    public static final String     YAR_PACKAGER_JSON    = "JSON";
    public static final String     YAR_PACKAGER_MSGPACK = "MSGPACK";

    public static Map<String,YarPackager> yarPackagerMap;

    static{
        register();
    }

    public abstract byte[] pack(YarRequestBody yarRequestBody);

    public abstract YarResponseBody unpack(YarResponse yarResponse);

    public static YarPackager get(String packagerName) throws Exception {
        packagerName = packagerName.toLowerCase();
        YarPackager yarPackager = yarPackagerMap.get(packagerName.toLowerCase());
        if (yarPackager == null) {
            String exception  = String.format("unsupported packager %s", packagerName);
            throw new Exception(exception);
        } else {
            return yarPackager;
        }
    }

    public static void register(){
        yarPackagerMap = new HashMap<>();
        yarPackagerMap.put(YAR_PACKAGER_PHP.toLowerCase(),new PhpPackger());
        yarPackagerMap.put(YAR_PACKAGER_JSON.toLowerCase(),new JsonPackager());
        yarPackagerMap.put(YAR_PACKAGER_MSGPACK.toLowerCase(),new MsgPackger());
    }

}

用一个JsonPackager继承YarPackager

public class JsonPackager extends YarPackager

然后我调用如下代码

YarPackager.get(yarResponse.getPackagerName()).unpack(yarResponse);
YarPackager.get(yarResponse.getPackagerName()).unpack(yarResponse);
YarPackager.get(yarResponse.getPackagerName()).unpack(yarResponse);
YarPackager.get(yarResponse.getPackagerName()).unpack(yarResponse);

调试发现YarPackagerstatic块只执行了一次。

这里面似乎隐藏着很多知识点,自己猜想子类继承父类,静态代码块没有被再次执行,这有点类似fork的时候代码段,进程控制块的拷贝。已经执行过的,在子进程的生成过程中,父进程已经执行过的代码,在进程控制块中有记录,所以拷贝到子进程中的时候会接着往下执行。这里的类的继承是不是有类似的东西呢?

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表