原文:http://blog.csdn.net/jinzhencs/article/details/50522105 一.拦截器的实现 地点:   package org.jivesoftware.openfire.interceptor-public class InterceptorManager 作用:   在每个packet处理之前先使用拦截器Manager里面的interceptors处理 解释:   这个拦截器Manager是一个List,里面包含多个拦截器的实例,如果需要多加拦截器…
最近看了一些android的源码,发现设计模式无处不在啊!感觉有点乱,于是决定要把设计模式好好梳理一下,于是有了这篇文章. 面向对象的六大原则 单一职责原则 所谓职责是指类变化的原因.如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责.而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因.通俗的说,即一个类只负责一项职责,将一组相关性很高的函数.数据封装到一个类中. 开闭原则 对于扩展是开放的,这意味着模块的行为是可以扩展的.当应用的需求改变时,我们可以对模块进行扩展,使其…
在研究OpenJDK源码过程中,我发现常用的设计方法就是2种:接口,接口-抽象类-具体实现类 . 在一些其它开源框架和业务开发中,经常存在着第3种设计,接口-具体实现类. 1.只有接口,没有实现类. 定义接口,制定标准. 在Java中,这个最典型的案例是JDBC的API的设计. Connection.Statement.PreparedStatement.CallableStatement.ResultSet等都是接口,没有任何实现方法. 这些接口就是一个标准,具体的实现,都是由数据库厂商自行实…
1. 脚踏实地的Netty源码研究笔记--开篇 1.1. Netty介绍 Netty是一个老牌的高性能网络框架.在众多开源框架中都有它的身影,比如:grpc.dubbo.seata等. 里面有着非常多值得学的东西: I/O模型 内存管理 各种网络协议的实现:http.redis.websocket等等 各种各样有趣的技巧的实现:异步.时间轮.池化.内存泄露探测等等. 代码风格.设计思想.设计原则等. 1.2. 源码分析方法 我一般是这样进行源码分析的: 首先是纵向,通过官方提供的demo,进行d…
最近Android 6.0版本的源代码开放下载,刚好分析Android源码的技术书籍<Android源码设计模式解析与实战>上市,我们邀请到它的作者何红辉,来谈谈Android源码中的设计模式,以及近期Android开发中的一些热点话题. 受访嘉宾介绍: 何红辉(@MrSimp1e),前友盟Android工程师,活跃于国内各大技术社区,热爱开源,热爱技术,热爱分享.Android开源库 AndroidEventBus . Colorful 作者, 开发技术前线 站长,<Android源码…
java开源即时通讯软件服务端openfire源码构建 本文使用最新的openfire主干代码为例,讲解了如何搭建一个openfire开源开发环境,正在实现自己写java聊天软件: 编译环境搭建 调试环境搭建 步骤列表 下载openfire源码 配置开发环境 配置ant运行 执行runconfigrations 调试环境搭建完成 下载openfire源码 openfire是github开源项目,其自有网站是http://www.igniterealtime.org 可在这个网站查看其相关发布信息…
本篇先分析openfire源码的主要流程,模块细节后续再继续分析: 一.简介: Openfire是开源的实时协作服务器(RTC),它是基于公开协议XMPP(RFC-3920),并在此基础上实现了XMPP-IM(RFC-3921),扩展了IM功能,对实施协作的各种场景做较全面的考虑,如用户在线状态切换.消息订阅.通知等等,因此可以用来搭建即时通信服务器,其搭建的方法也很简易. 1.账号体系: XMPP服务器的帐号基础,是域(Domain),例如:org.example.com,它在服务器配置时的时…
可恨的异常 程序开发过程中,最讨厌异常了. 异常代表着程序出了问题,一旦出现,控制台会出现一屏又一屏的堆栈错误信息. 看着就让人心烦. 对于一个新人来讲,遇到异常经常会压力大,手忙脚乱,心生畏惧. 可亲的异常 但是,如果我们反过来看,异常可是非常好的错误提示. 在JDK中,定义了大量的异常,只要程序抛出了异常,我们根据异常的名字就能知道程序大概出了什么问题. 比如看到NullPointerException,我们就知道方法所属的对象是Null. 看到IndexOutOfBoundsExcepti…
摘要 本文先给出一个看似很简单实则有深意的Java笔试面试题,引出JDK内部的缓存. JDK内部的缓存,主要是为了提高Java程序的性能. 你能答对这道"看似简单,实则有深意"的Java题目? 我们首先来看一个简单的程序: public class IntCacheDemo { /** * 一道经典的Java笔试面试题 */ public static void main(String[] args) { Integer a = 2013; Integer b = 2013; if (…
本篇主要讲解java.util.Arrays这个针对数组的工具类. 1.可复用的工具类和方法.  这个工具类里,包含很多针对数组的工具方法,如 排序.交换.二分查找.比较.填充.复制.hashcode.toString等. 2.禁止默认构造函数,防止实例化.    private Arrays() {    }   这个类只包含了一些静态的工具方法,实例化没有任何意义. 更严格一点,还可以将类定义为 public final Arrays. 3.把针对数组的工具方法,统一放到一个工具类中,方便管…
Comparable和Comparator是JDK中定义的2个比较接口,很相似,但又有所不同. 这2个接口的作用和区别也是Java中的常见经典面试题. 下面我们就来详细介绍下这2个接口的定义.作用.区别.模式.应用场景和代码案例. 定义 public interface Comparable<T> { public int compareTo(T o); } public interface Comparator<T> { int compare(T o1, T o2); bool…
OpenJDK源码研究笔记系列文章,是我在阅读OpenJDK7源码的过程中的一些体会.收获.看法. 把研究过程中的成长和收获一点点地整理出来,是对自己研究学习的一个小结,也有可能给学习Java的一些同学带来一些启发. 我打算每篇只讲解一点,这样篇幅较小,读起来没有太大压力. 写起来压力也小,抽出10到20分钟就可以写1篇. 本篇简要介绍,方法(函数)体内的参数检查,遇到不合法的输入参数时,抛出带关键错误提示信息的异常. /** * Initializes a new instance of th…
可恨的异常 程序开发过程中,最讨厌异常了. 异常代表着程序出了问题,一旦出现,控制台会出现一屏又一屏的堆栈错误信息. 看着就让人心烦. 对于一个新人来讲,遇到异常经常会压力大,手忙脚乱,心生畏惧. 可亲的异常 但是,如果我们反过来看,异常可是非常好的错误提示. 在JDK中,定义了大量的异常,只要程序抛出了异常,我们根据异常的名字就能知道程序大概出了什么问题. 比如看到NullPointerException,我们就知道方法所属的对象是Null. 看到IndexOutOfBoundsExcepti…
在上一篇OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构中,我们大致了解了Java字节码文件的结构. 本篇详细地介绍了如何读取.class文件的大部分细节. 1.构造文件  // 字节码文件User.class String userClass = "C:/User.class"; File file = new File(userClass); 2.构造输入流 FileInputStream fin = new FileInputStream(file);…
最近在看OpenJDK源码的过程中,顺便看了Java编译器(javac)的源码. 为了理解javac的源码,需要先搞懂Java字节码文件(.class)的结构. 于是,我就认真看了下OpenJDK中Java字节码文件的相关源码,结合大学期间对JVM的研究,参考JVM规范第2版(英文原版),特意整理下. JVM规范中定义的类文件的结构 注:使用是类似于C语言的表示方法 u1: unsigned one-byte  无符号一个字节 u2: unsigned two-byte  无符号两个字节 u4:…
在研究OpenJDK,Java编译器javac源码的过程中,发现以下代码. 顿时发现枚举类竟然也有如此"高端大气上档次"的用法. 沙场点兵(用法源码) com.sun.tools.javac.file.JavacFileManager.SortFiles protected enum SortFiles implements Comparator<File> { FORWARD { public int compare(File f1, File f2) { return…
前14篇文章,分享了JDK中值得学习和借鉴的编码和设计方法. 每个硬币都是有两面的.Every coin has two sides. 当然,JDK中也有很多值得改进或者说富有争议的设计. 本篇,就来详细吐槽下JDK中的10个富有争议的设计. 网友指出1.求和抛异常,错误提示不合理. 在OpenJDK源码研究笔记(一)-参数检查&抛出带关键错误提示信息的异常这篇文章中,有个网友指出:"第三个if的提示信息有点问题.前两个if说明了position和size都不可能为负,求和通常不可能为负…
在阅读Javac源码的过程中,发现一个上下文对象Context. 这个对象用来确保一次编译过程中的用到的类都只有一个实例,即实现我们经常提到的"单例模式". 今天,特意对这个上下文容器进行解析,主要是讲解上下文容器.单例模式和延迟创建. 通过对OpenJDK和Javac源码的一点点解析,希望自己能够搞懂JDK和Javac的实现. 1.OpenJDK源码示例 a.上下文容器 public class com.sun.tools.javac.util.Context{ //构造函数 pub…
元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. JDBC中的元数据,有数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaData) 分别封装了数据库产品名字等数据库信息.查询参数的个数等参数信息.结果集的列数等结果集信息. 数据库元数据 /** *数据库的整体综合信息. */ public interface Dat…
1. Netty源码研究笔记(4)--EventLoop系列 EventLoop,即事件驱动,它是Netty的I/O模型的抽象,负责处理I/O事件.任务. 不同的EventLoop代表着不同的I/O模型,最重要.最主要的是NioEventLoop,表示多路复用的I/O模型,对应jdk的NIO. NioEventLoop是单线程的,它通过将I/O事件的等待时间用于执行其他任务,从而提高了线程的利用率,提高了单线程的吞吐量. 然而用户并不能直接使用EventLoop,应该使用EventLoopGro…
1. Spring IOC源码研究笔记(2)--ApplicationContext系列 1.1. 继承关系 非web环境下,一般来说常用的就两类ApplicationContext: 配置形式为XML的:ClassPathXmlApplicationContext.FileSystemXmlApplicationContext 配置形式为注解的:AnnotationConfigApplicationContext 前者的继承链为:AbstractApplicationContext -> Ab…
Java源码阅读的真实体会(一种学习思路) 刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧,如果你从来没有学过Java,或是任何一门编程语言如C++,一开始去啃<Core Java>,你是很难从中吸收到营养的,特别是<深入Java虚拟机>这类书,别人觉得好,未必适合现在的你. 虽然Tomcat的源码很漂亮,但我绝不建议你一开始就读…
Java源码阅读的真实体会(一种学习思路)   刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧,如果你从来没有学过Java,或是任何一门编程语言如C++,一开始去啃<Core Java>,你是很难从中吸收到营养的,特别是<深入Java虚拟机>这类书,别人觉得好,未必适合现在的你. 虽然Tomcat的源码很漂亮,但我绝不建议你一开始…
1.下载源码:http://www.igniterealtime.org/downloads/source.jsp 2.把源码解压出的openfire_src目录放至eclipse workplace(注意:若是变更了解压出来的文件名称,则接下来全部用到文件名称的地方都要作出对应更改,否则会报错!) 3.把openfire_src目录里的三个没用的html文件删除 4.打开eclipse,新建一个名为openfire_src的Java Project,然后finish 注:此处的默认路径为ope…
根据xmpp协议 客户端发送: <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>XXXXXXXXXXXXXXXXXXXXX=</auth> 其中,xmlns是命名空间,mechanism是用户名密码的加密方式,auth 标签的text内容为用户名密码通过PLAIN方式加密的字符串. 服务端接收: 通过ConnectionHandler类的messageReceived方法接收,process中处理 e…
这篇文章是在你已经down了openfire的源码,然后在本地跑起来了,再然后开发了一个自己的插件,想要发布到服务器上.ok这时候出现了一个问题,怎么才能发布到服务器上呢?别急往下看: 1.运行ant中openfire[default] 2.将生成的openfire拷贝到linux服务器中(通过ftp) 3.进入到openfire/bin 目录中,执行./openfire.sh命名启动服务器 注:如果出现,在linux下执行sh文件时提示下面信息: -bash: ./xx.sh: Permiss…
原文:http://blog.csdn.net/jinzhencs/article/details/50457152 1.linux版本的3.10.3解压部署启动(过程略,参考我的另一篇博文http://blog.csdn.net/jinzhencs/article/details/50404574) 2.停止linux上的openfire 3.eclipse本地源码修改完毕后,先Ant clean.再Ant openfire.得到相应的work及target. (一定要clean了再openf…
1.源码通过编号后,会生成target目录,直接把target目录拷贝到linux下即可: 2.启动openfire: ./openfire.sh start 3.退出直接ctr + c 问题:如果一直启动不了,有可能是之前配置信息冲突问题,如数据库连接不上等,需要重新配置,删除conf/openfire.xml下的  <setup>true</setup> 后,重新启动即可:…
我们在前面分析客户端引用的时候会看到如下这段代码: // 产生开始调用事件 if (EventBus.isEnable(ClientStartInvokeEvent.class)) { EventBus.post(new ClientStartInvokeEvent(request)); } 这里用EventBus调用了一下post方法之后就什么也没做了,就方法名来看是发送了一个post请求,也不知道发给谁,到底有什么用. 所以这一节我们来分析一下EventBus这个类的作用. 首先我们来看一下…
Dubbo源码包介绍当我们从github把Dubbo源码下载下来之后有如下源码包   下面来说明每个包的作用,以便我们有目的的阅读代码 dubbo-admin dubbo管理平台源码包,用来管理dubbo服务的启动.禁用.降权.接口测试等,操作界面如下   dubbo-cluster 集群模块,将多个服务提供方伪装为一个提供方,包括:负载均衡, 容错,路由等,集群的地址列表可以是静态配置的,也可以是由注册中心下发. dubbo-common 公共逻辑模块,包括Util类和通用模型 dubbo-c…