抠腚爱揉曼 Coding Iron Man

29Sep/110

Scala和Java的互操作

Posted by Anson

最近在实践中遇到一些Scala和Java互操作的问题,记录一下
BTW: gist + wordpress的gist插件各种好使啊 果断抛弃各种syntax highlighter插件

Scala Map Java Map
下面代码是两个隐式转换,用于在两者之间互转

Scala repeated parameters Java varargs
不好好看书就急着动手的杯具……纠结了很久才知道如何正确调用可变参数列表的Java方法

如果不使用: _*这个annotation告诉scala我要展开成varargs,不论你如果toArray如果反射new出Object数组都是没有用的,整个Array或者List会被作为一个Object传入,而不是展开成多个参数传入调用方法

Tagged as: , No Comments
11Jan/110

Project Lombok给力的new feature

Posted by Anson

唔 刚SJ同学推荐了下Project Lombok的新特性,看了下果然V5啊,从此可以和那些乱七八糟的类型声明说byebye了(虽然只是某种程度上)……

简单来说呢 就是用了Lombok后腰不酸腿不疼走路也有劲了我们就有了val,可以像这样:

val map = new HashMap<String, Object>();
// 这东西等效于这样
final HashMap<String, Object> map = new HashMap<String, Object>();

看上去就像scala类型推断似的!但其实没那么强……只能推断你的初始化表达式的类型,而且现在只支持local variable和for each loop中的声明。

真相在这里->Project Lombok,对IDE的支持现在是eclipse和netbeans(with bugs),以及构建时对maven的支持。

BTW:0.9.3的stable包里没有val,在0.10.0-逼她2这个perview包里

Tagged as: No Comments
10Jan/111

一个很简单的JavaBean Validator

Posted by Anson

前几天和同事聊到对于复杂表单提交上来的数据需要校验很是麻烦,想到通过annotation注解校验规则到field上会清晰方便不少,然后查到JSR303就是干这事的,有一个实现是hibernate搞的hibernate-validator

不过既然想到了就顺手实现下试试,因为只是简单尝试,也不顾什么JSR303了,想到哪写到哪,在某需求讨论会上花了半个多小时搞出了下面这个非常简单的Vifix Validator。现在只实现了一个NotNull、一个Regex以及一个可指定自定义validator的annotation。

如果哪位有兴趣看看我的悲催代码的,下载点这里XD->VValidate。工程通过maven3构建,测试在src/test/java/TestDriver.java。

Tagged as: 1 Comment
17Aug/104

Scala笔记2

Posted by Anson

最近几天杂事很多,导致那本薄薄的Scala至今未看完……今天先来接一下Scala笔记2

  • Scala的访问控制机制和Java有别。有些许的概念不同而且能够做到更加细粒度的控制。Scala默认访问修饰为public,Java则是微妙的default。Scala中的protected则比Java更小气,它只对自己和派生类可见,同包下的其它类无法访问,而且类也只能访问自己的基类中的protected成员,无法访问继承同样基类的其余派生类中的基类protected成员。Scala对细粒度访问控制体现在private和protected修饰可以通过方括号指定额外的报名或类名来赋权。
11Aug/106

Eclipse仿Netbeans配色方案

Posted by Anson

今天把Intellij IDEA、Netbeans的最新版都搞了下来玩了下(主要是想试下它们分别的Scala插件),不过最后还是因为习惯问题屈服与Eclipse的淫威之下……好吧其实大学里的时候我明明还是Netbeans控的,而且感觉Netbeans6.5之后的UI和配色都很符合我的口味,而且Eclipse那像干了的血一样的keyword颜色我也实在审美疲劳了,于是我决定把Netbeans的配色偷过来。

Netbeans的配色其实很简单,黑灰蓝绿棕就这几种颜色,对照着改下还是相当快的,先上截图。

打开Eclipse->Window->Preferences->Java->Editor->Syntax Coloring(当然也可以在Perferences的filter里直接输入Syntax定位)

11Aug/102

Scala笔记1

Posted by Anson

最近在看Scala,把笔记贴过来存档。

  • Scala基于JVM,通过scalac编译成JVM字节码。不同于Groovy(同样是跑在JVM上),Scala是静态类型的,因此可以支持泛型和多态等特性。Scala完全使用自己的规则创建,因此相对于Groovy来说学习成本更高(Groovy其实就是Java的强化?简化?版)。而且因为基于JVM,因此可以很好的和现有Java项目整合,在Scala中可以直接使用Java现成的无数类库。
  • Scala通过var和val定义变量。var定义可变量,val定义不可变量,类似Java中的final,一旦初始化赋值后就无法改变。Scala鼓励尽可能的使用val让类和方法获取原生的线程安全性,同时通过val和闭包(方法对象)的使用来支持函数式编程。当然Scala也可以使用Java抠腚们熟悉的命令式来书写。
  • 既然Scala支持FP,因此它确实支持尾递归优化。只不过受制于JVM,只能做到简单的尾递归优化,在比较复杂的情况下无法确实优化。下面的代码清单是一个尾递归的例子,递归了一亿次,一切正常。
    object Main {
      def main(args: Array[String]): Unit = {
        println(doSum(100000000L, 0))
      }
    
      def doSum(n: Long, sum: Long): Long = {
        if (n == 0L) {
          sum
        } else {
          doSum(n - 1, sum + n)
        }
      }
    }
    
22Jul/100

凑数更

Posted by Anson

不得不说……最近不知道在弄什么,所以也没什么东西写,于是来凑数更了……

  1. Class
    不同 ClassLoader实例加载的Class是不同的。所以当你发现明明传入的类型一摸一样却报ClassCastException的时候,多半是ClassLoader搞的鬼……嗯,之前玩Groovy万能console的时候就遇到了。
  2. StringBuilder
    很多时候我们被教导使用StringBuilder来代替字符串的+操作以提高性能和减少内存占用,但其实对于一连串的+操作,编译器会自动把它们变成StringBuilder的append 操作。所以当你有一长串的+操作且都是连在一起的时候,尽请放心使用,编译器已经帮你搞定了。另外StringBuilder是非线程安全的,所以在绝大多数实现下效率高于StringBuffer。
  3. Annotation
    嗯……Annotation挺好使的。Annotation可以被Annotation,但是被Annotation的类直接getAnnotation是get不到Annotation它的Annotation的Annotation的。而且Annotation本身不能继承别的Annotation,所以如果你希望传递Annotation的话,你需要递归获取所有Annotation的Annotation才能知道到底这个类有没有被你希望的那个Annotation给Annotation。我是故意这么写的,真蛋疼。
    另,spring就可以识别到Annotation的传递,你可以把@Component注解到你自己的Annotation上,然后用你自己的Annotation注解bean,spring会识别到这个传递关系,并把bean纳入管理。
16Jul/105

用Groovy给系统开个万能console

Posted by Anson

系统上线了,有BUG,数据错了,用户抱怨了,然后线上DB权限又不开放给开发,走流程各种纠结(还扣分……靠),这时候应该怎么办呢?

一般来说我们会做个console,把可能需要的功能都做上去,但往往不可能全都考虑周全,所以如果我的console可以动态的执行各种有的没得功能该多好。

嗯……所以我们可以想办法让系统跑一段我们自定义的代码,这时候Groovy显然是个很好的选择(对于Java应用来说)。它将会和你的应用跑在同一个容器中,可以获取应用的classLoader,也就是说它可以控制应用的每一个部分。

2Jul/102

Java序列化和hessian序列化的区别

Posted by Anson

在远程调用中,需要把参数和返回值通过网络传输,这个使用就要用到序列化将对象转变成字节流,从一端到另一端之后再反序列化回来变成对象。

既然前面有一篇提到了hessian,这里就简单讲讲Java序列化和hessian序列化的区别。

首先,hessian序列化比Java序列化高效很多,而且生成的字节流也要短很多。但相对来说没有Java序列化可靠,而且也不如Java序列化支持的全面。而之所以会出现这样的区别,则要从它们的实现方式来看。

先说Java序列化,具体工作原理就不说了,Java序列化会把要序列化的对象类的元数据和业务数据全部序列化从字节流,而且是把整个继承关系上的东西全部序列化了。它序列化出来的字节流是对那个对象结构到内容的完全描述,包含所有的信息,因此效率较低而且字节流比较大。但是由于确实是序列化了所有内容,所以可以说什么都可以传输,因此也更可用和可靠。

而hessian序列化,它的实现机制是着重于数据,附带简单的类型信息的方法。就像Integer a = 1,hessian会序列化成I 1这样的流,I表示int or Integer,1就是数据内容。而对于复杂对象,通过Java的反射机制,hessian把对象所有的属性当成一个Map来序列化,产生类似M className propertyName1 I 1 propertyName S stringValue(大概如此,确切的忘了)这样的流,包含了基本的类型描述和数据内容。而在序列化过程中,如果一个对象之前出现过,hessian会直接插入一个R index这样的块来表示一个引用位置,从而省去再次序列化和反序列化的时间。这样做的代价就是hessian需要对不同的类型进行不同的处理(因此hessian直接偷懒不支持short),而且遇到某些特殊对象还要做特殊的处理(比如StackTraceElement)。而且同时因为并没有深入到实现内部去进行序列化,所以在某些场合会发生一定的不一致,比如通过Collections.synchronizedMap得到的map。

Tagged as: , 2 Comments
2Jul/104

获取指定package路径下的所有class

Posted by Anson

最近有个需求,通过Annotation来获取class。刚好spring的Annotation注册方式是这样的,于是把spring相关的代码翻了一遍,翻完之后就尝试自己简单实现了下,结果如下。