有关Java的动态代理

很早之前就知道Java的代理,同时也在设计模式这本书中了解了代理模式。于是开始尝试基于Java原生特性进行动态代理。 代理的很大的一个好处就是解耦合,通过这种手段,可以使程序有很好的可读性,而且在模块化上有着更好的实现,其实在Spring框架中,他所使用的AOP,很大程度上也是基于动态代理的方式进行的。 对于我们自己编写的代理类,我们可以随意的进行字节码的操操作,方便我们进行字节码的增强。有关字节码的增强,我会在下一篇日志中进行详细的描述。 现在先说一个使用ClassLoader的代理模式的简单例子。 我们现在有一个接口。接口中的代码如下: 这边是我的实现类代码,如下: 这是我的主函数,同时也是执行代理的主要内容: 在这边主要需要详细说一下这个ProxyMain类,我们可以看到这边这个类实现了InvocationHandler接口,这主要是用来实现对代理的全部Something类的方法的调用。 这个Proxy主要使用了Java反射API,将一般的方法调用映射到SomethingImp接口中,由此类推。 但这样的简单的例子,也有许多简单的代码。使用这些字节操作类库也是同样的具有挑战性。代码量和复杂度是代理的两大特点。创建简单的代码十分的困难。但是这样的代理也没有提供在系统范围内指定执行点的功能。但是这一点正好是AOP解决办法的关键点。 面向切面编程正式希望有这么一种机制,将业务逻辑横向切分。从而达到代码复用等一系列的优点。 写这篇文章的目的,就是因为有些同学问我面向切面编程的好处,同时,如何进行字节码操作(关于这一点,我将在之后的日志中详细描述),在代码量比较小的项目中,面向切面的优势确实无法提现,不过面向接口编程的思想,确实得需要自己的领悟。 通过这样的代码编写,再不考虑性能的情况下,可以热替代代码,比如一些工具类,我们可以在调用时采用这样的方法进行编写。这样的好处就是,如果需要热替代代码,只需要将对应的class文件进行替换,即可。

Oracle面试之行

    之前也是和同学做了一下Oracle的PAC测试,也没有怎么去想结果,但是在周六的晚上九点半接到电话,说今天要去面试- -,然后就翘了计算机组成去面试了,其实呢,面试官挺好的,主要我去的比较早,然后一个人挺无聊的,就看了一会kindle.     接下来说面试的内容了,总体来说,难度不是很难,但是很基础,有些内容以前是看到的,但是在这种情况下,一时间也没有想起来。。。不得不说是一个败笔。     第一个是英文的自我介绍,这是被人坑的,我之前问了一下进甲骨文的学长,他说,不需要进行英文面试,于是我就没有准备,然后,就悲剧了,。还好我的英文还没有想像中的那么烂,不过有一个很有趣的小插曲,就是中途我有一个单词不会拼,就是红外传感器,传感器是sensor但是红外我就不知到了,我就直接问面试官,红外怎么拼。。他说我也不知道-= =,于是就在这样的气氛中,过了,不过他会打断你,然后问几个问题,我很神奇的发现,我居然临时使用英文把我做离线地图的方法,和过程描述给他了。。它还真听懂了-= -。。。还知道,我是假装浏览器的行为爬下来的。。     接下来是技术面试了,就是一些基本的问题:         1.抽象类和接口的不同,什么时候使用继承,什么时候使用实现接口。新建一个ArrayList对象,这边考察了装箱和拆箱,还有范型编程,还有ArrayList和LinkedList的区别等等,这些都是小儿科,常规的题目。         2.描述一下配置环境变量的时候需要设置PATH,和CLASSPATH,这些都是干什么的。这个很简单,第一个是执行路径,第二个就是运行时寻找库的路径,这也没什么。         3.然后就是考察对JDK源码的理解,比如说Object的源码,我当时只说了toString(),hashCode(),本来还能说equals()的,结果最终还是没能想起来。然后回来看了一下源码,发现自己还是弱了。。。这是源码中的方法,这一点还是比较失败的。                  4.接下来是多线程的问题,不过可能是我和他的理解不是很一样,就是两个线程访问一个对象的时候,会不会读脏数据。我的理解转换成代码就是这样的:…

近期几个调错的总结

    文如标题,最近的几个调试的笔记了。     第一个案例就是一个学长写的网关模块代码,代码很长,很乱,真的很乱- -,所以 也没有想去研读代码,直接上手测试不过的案例,开visualVM进行跟踪,这个例子就 是在一条连接进入到连接跪了这段时间,这个程序的cpu占用会到100%,然后我就看, 发现这个进程中并没有太多的线程,也没有过多的GC,所以暂时推算是出现了while的 死循环。因为这个学长的日志系统做的极端的糟糕,所以从他的日志信息中也得不到什么重要的信息,所以只能硬着头皮去看代码,终于找到了根源,其实还是很简单的,他在读取socket的数值的时候,使用的是一个!=null的判断语句这个语句是不行的,因为BufferedReader有个很神奇的功能就是把null值的字符串变成”null”,所以加上一个!**.equals(“null”),然后程序就过了。     第二个案例也是一个学长的Java程序,在服务器上跑着,突然就频繁GC了,最终,OutofMemoryError跪了。也是打开VisualVM,发现频繁的GC出现在Old区,初步可以判断是大对象申请过多,在阅读了代码之后,最终确定了是在数据库读取阶段使用了ResultSet,同时使用完之后并没有即使清理,导致对象创建过多同时多存在引用关系,导致系统不能及时GC,所以导致了内存溢出,知道这个问题之后,一切都简单了。     第三个案例就是一个同学找到我,说在配置SSH免登录的配置之后,登录依旧是需要密码,于是,我按照流程帮他走了一遍,发现问题依旧存在,于是初步推断是权限问题,然后看了下这位同学的home权限,发现是777.。。所以大家都懂了,将.ssh目录设为700,authorized_keys文件设为600,一切就正常了。     最后一个就是自己的心得,将Tomcat7整合进了我的IDE,方便阅读和调试代码了,可以在这个地方下载我做好的Tomcat7。         接下来,我的任务也就简单了,继续阅读Netty和Tomcat源代码,同时跟进我的Hadoop.

基于Netty实现WebSocket

Netty的作用 Netty在这边的作用是做一个中间件,主要负责的是消息的接受,还有消息的处理,通过NIO的方式。 因为Netty易于开发,性能,稳定性和灵活性,不妥协的方式来实现。 文件结构 |– WebSocketServer.java |– WebSocketServerHandler.java |– WebSocketServerPipelineFactory.java |– websocket.html 具体解说 WebSocketServer.java 这个类的主要作用是进行服务器的一些部署,还有进行bootstrap,这主要是在进行启动配置 在这边我们可以看到,我们将WebSocketServerPipelineFactory注册进入了Netty,即将Netty的默认处理逻辑设置为我们需要的Factory. WebSocketServerHandler.java 这个类主要是封装了我们的处理逻辑。 由于Netty封装了所有接受的消息,所以在书写处理逻辑的时候,我们只需要覆盖两个父类的方法就行。 WebSocketServerPipelineFactory.java…

一个简单的Servlet容器

文件结构 |– HttpServer.java |– Request.java |– Response.java |– ServletProcessor.java |– StaticResourceProcessor.java |– IndexServlet.java 文件的作用 HttpServer.java 这个类的作用和之前的静态类的服务器作用一样,唯一不同的一点就是在区分静态请求和动态请求上。 不过这边也是有一些问题的,因为如果我们的路径并不是包含”servlet”,则这方法也失去了他的意义。 Request.java 这边需要注意的是,这边需要实现ServletRequest接口 这个类的主要的作用就是从用户的请求中获取数据,其他的,也就不在这个程序中进行获取了…

有关静态文件服务器的编写

详细代码在这:MikeDog 文件结构 |–HttpServer.java |–Request.java |–Response.java 具体作用 首先是三个类,一个是主要的Server类,然后是Request和Response类,后两个是HTTP协议中的两个用于反馈和接受的类。 Request中主要的方法就是从一个HTTP头中抽取出URI,也就是访问路径。代码如下: 主要是因为HTTP协议中的地址信息,以下是一个HTTP请求协议: 从中可以看到URI在第一行的两个空格之间,当然,上面的写法比较风骚,因为这样的写法很容易带来漏洞,因为如果URI并不是标准的,或者说,有人故意发送一个错误的URI,导致解析错误什么的。 然后看Response中的代码,主要也是写出的,因为从Request中取出目标名称之后就可以从定义的ROOT目录中寻找那个HTML文件,然后要做的就是读出来,写出去。 于是这就成了,其中new File(HttpServer.WEBROOT, request.getUri());,就是读取文件的代码 注意:在HTTP头中,有文件大小的描述,在写出去的时候需要注意修改。如下: 最后就是HttpServer了,他的作用就是建立Socket连接,然后交给Request解析,然后将结果写入Response. 下面的代码就是过程,简单易懂: 最后就是我没有想到的一点,也是学到的一个新的方面: 即通过这个方法来获取网站根目录 最终运行结果(浏览器中)

KMP字符串匹配算法和JDK

一般的朴素字符串匹配算法: 从目标串Target的第一个字符开始扫描,逐一与模式串的对应字符进行匹配,若该组字符匹配,则检测下一组字符 如遇失配,则退回到Target的第二个字符,重复上述步骤,直到整个Pattern在Target中找到匹配,或者已经扫描完整个目标串也没能够完成匹配为止 算法理解起来很简单,实现起来也容易,但是其中包含了过多不必要的操作,也就是在目标串中,有些字符是可以直接跳过,不必检测的 但是在特定的情况下,这样的算法还是有可优化的地方的. 不妨假设我们的目标串:Target = “a b c d e a b c d e a b c…

一切都是奖学金惹的祸

终于到了大三了,也想好好静下心来好好学习了,也要准备马上就要来的实习生面试笔试了。 同时,也到了评奖学金的时刻了。按理说,我的成绩也不错, 而且还有传说中的混奖学金大赛(蓝桥杯)的国三和省一,理论上应该是拿钱没有问题, 可是,不想我在大二上学期,一直特立独行,选了两门超修课,然后忘了= =,忘了。。。 于是,到期中考试我看课表的时候才发现有这两门课,于是乎- -,我就开始准备期末考试了,因为课程都不难,而且我都是有所了解的,所以看看书觉得应付考试也没什么问题,于是就放在一边了,到了离期末还有几周的时候,我去问学长,这两门课的期末考试内容,然后他们告诉我说,没有期末考试。。没有期末考试,。。。于是我这两门蛋疼的课都成了0分,虽然是很悲剧,但是也了了我的一个心愿,拿一次0分= =。。。 这件事就这么安静的过去了,然后,高潮来了,因为我们评定奖学金对学习是有硬性要求的,不能低于70的,但是超修课不算。所以我就放心的过了几周,到了15号(23号评定结束),辅导员找到我说,本来想分给我卓越创新一等奖学金的,但是我有两个0分。。不能给,在被禁名单里。。我瞬间就无语了,然后赶紧和她说明情况,然后她淡淡说了一句,我看看那能不能解决,于是打了几个电话之后给我指明了一条明路,去学院教务处开个证明,说明这是超修课,然后去校教务处看看能不能消除这两个0分,接着去团委盖个章,然后去找学工处,让他们消除这个0分限制。 我是我屁颠屁颠的去找了学院教务处,然后扯了半天,好不容易说服他给我开了个证明(说了15分钟,还不算辅导员找他的时间(辅导员失败了。。。))。。。然后,这一天就结束了。还不到5点,都下班了- -。 第二天,我终于拿着证明去了校教务处,和他们说明情况,然后他们看了下我的证明,淡淡的说了一句,删,是不可能的,到时候你可以申请隐藏成绩,出国的时候没有影响。。然后问道奖学金的事,他说了句,这个啊,就去找学工处就行了。然后我又去找了学工处,期间我走错楼的事情我也就不说了,终于我找到了已经快下班的学工处头头。。。然后说明情况,提交证明,然后,他很牛逼的用超管进了系统,然后删了这两门成绩,然后和我说,没问题,于是,我打电话给了辅导员,此时,他已经下班,然后说,明天我看看啊。于是,又一天过去了。 到了周三,辅导员说还是不行。。。于是我翘课(课下午全满,不翘这天就没时间了),去找学工处头头,然后,他不上班 – -,上午下午我都去了。。。都没上班。。。我了个擦,老师还点名- -,我是第一次不去啊。。。然后到了周四,他终于在了,我又去找了他,他又很牛逼的用超管进系统,有重复上述步骤,然后和我说,你和辅导员联系下,于是我就打过去了,辅导员在开会。。要等10分钟。。等十分钟= =,然后我就在那等。。一帮领导在坐着,我就在门口等。。那个头头实在看不下去了(应该是我碍眼了),说,你回去吧,有什么问题,让辅导员直接和他联系。于是我就去找辅导员了,然后说了下情况,我就回实验室了,然后下午的课我给忘了= =,都没有想到上课的事。。然后老师又点名了-  -,我也是第一次不去。。。无语啊。。 周四,辅导员说,还是不行,我无奈,因为辅导员能力有限,所以他也改变不了什么,于是,我再一次找到那个头头,他说,应该是系统问题,然后让我去找做系统的我们学院的某个老师,我把消息转达辅导员,然后准备去找那个老师,辅导员看看我也蛮累的,就说,我来吧,你回去等消息吧。。等消息。。。这句话听上去就像,都别烦了,没了就没了吧。。。这怎么能行,我还指望这钱买衣服的。于是,我每隔3小时一个电话。…