Java 引用传递和值传递

前几天有个朋友问了我个问题,就是 Java 中什么时候是值传递什么时候是引用传递。他的理解是,基本数据类型是值传递,复杂对象是引用传递。 所以就有了如下的一个测试代码: public class Main { public static void main(String[] args) { int a = 0; Integer b = 0; System.out.println("int a:" + a); System.out.println("integer b:" + b); changeValue(a, b); System.out.println("int a:" + a); System.out.prin... [阅读全文]

记一个非常有意思的项目

机缘巧合之下,和朋友聊天的时候,知道他们那有一个基于 Java 的 web 系统。于是,作为一个 Java 功底还算过得去的人,我觉得,应该可以去玩玩。 因为,作为一个 Javaer,说到 Java web 的时候,无外乎 Spring,Struts,Hibernate,或者 MyBatis。于是乎,作为复习,我拿过来看了下。不过第一眼确实是非常惊讶。 因为朋友那边没能拿到相关的文档,没有部署方式和设计方式,所以也是一头雾水。各位可以看下他的目录结构: ├── b2b-api-base ├── b2b-api-content ├── b2b-api-customer ├── b2b-api-lucene ├── b2b-api-mail ├── b2b-api-payment ├── b2b-api-product ├── b2b-api-... [阅读全文]

一次线上debug的过程

事情的缘由是这样的,很久之前,我写了一个爬虫,然后爬虫幸福的运行在服务器上,突然有一天,我收到一份邮件,上面写着爬虫失效,然后 肯定先是ssh上去看看进程. 先top一下看状况,一切良好,java进程的运行比较平稳,所以排除了死循环的错误,或者是NPE退出的错误. 然后线上使用jstack查了下虚拟机栈,然后就发现了如下一段奇葩的栈: "pool-6-thread-629" prio=10 tid=0x00007fcfb4004000 nid=0x51e0 runnable [0x00007fcf6c6c4000] java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(... [阅读全文]

Java中数字的几个好玩的地方

开始 我们先从一个简单的例子开始: 你们可以大胆的猜测下结果。 相信很多人直接就已经没有了往下看得欲望。因为这道题目很简单,特别是还做了对比的输出。其中的道理也很简单,越界了。因为在给result赋值之前,后面执行的过程都是基于int的计算。所以最后的结果就是: 好了,简单的问题结束了。开始更加有趣的事情了。 传说中的Integer常量池 说到常量池,String的常量池应该是大家都比较熟悉的。毕竟作为公司的面试题目,大家都不会陌生。相信网上说到这个的也不会少,现在我们说的就是Integer的常量池。 也是先从代码开始。先看如下代码: 你们也可以猜猜这个的结果 其实也很好玩,想想看拆包和装包。就知道了。不过这边还是有几个好玩的地方,因为他的答案可能会超出你得理解... [阅读全文]

Btrace调试Java代码

之前有一个同学提到了一个需求,就是需要在程序跑起来之后查看程序的调用情况,和一些参数变化,当然,如果 没有部署到生产环境中,我们可以用强大的Eclipse使用Debug模式进行单步调试。但是一旦部署到了生产环境中, 我们的强大的调试工具就失去了作用。 于是我们可以参考使用JVisualVM中的Btrace。当然本文章的大部分内容都有参考周志明的深入理解Java虚拟机 接下来的内容就是简单的介绍下Btrace的一个简单的示例。 当然,使用JVisualVM连接JVM的简单步骤我们就简单的跳过了。我们直接上程序例子。 首先是我们的Example代码。 代码很简单,之所以需要在执行之前加入scanner,只是因为我们需要为之后的Btrace嵌入做一个缓冲。然后可以 手动的形式启动我们的代码。 ... [阅读全文]

Jar代码注入

有段时间没有写博客了,主要的原因是期末考试和回老家过年,这段时间基本上没有看相关的内容,不过还是有很多可以用来分享的。 就像前一篇日志提到的一样,Java可以从字节码的方式进行玩耍。通过使用Javassist这个类库,可以很方便的进行字节码的操作。 从这个角度讲,有很多我们之前没有想到的方面也可以进行实施。比如说有这么一个jar包,需要进行引用开发,于是乎,我们可以进行一些简单的恶作剧,可以在某一个方法执行之前或之后加入一些注入代码,同时这个方法还可以进行一些简单的破解工作。 主要使用到的工具有jar打包,Javassist类库。接下来我们来讲一个简单的小例子。这个例子就是展示如何向一个已经打包好的jar注入代码。 首先,我们先就看看这个简单的类代码: 之所以包含main函数,主要是用来感受下代码注入之后的效果。 ... [阅读全文]