这几天潜心研究了一下Hibernate, Spring, ASM, Java5 Instrumentation。 恩,大概列出了这些技术来,明眼人就知道我要干啥了。没错,万恶的元编程,我最痛恨的元编程要登场了。我痛恨元编程,是因为我认为它的能力超越了人类大脑的范围。但是,Java想要在语法上能有超越,唯一的办法就是元编程了。在Java中做元编程有两种方式:
1、操作字节码
比如 AspectJ
2、用动态派生的类替换基类
比如 Spring AOP,Hibernate的Lazy Loading
后者能够达到的能力基本上已经被利用尽了。我感觉,要想突围,不妨就像AspectJ一样,走到字节码这个层面去。由于robbin给的挑战题目是去Active Record相关的,大家对于RoR的很多热情也投注在Active Record上,那我就从Hibernate用法简化入手吧。现在没有实现所有的功能,但是可以给大家看一个样子:
Hibernate配置文件,放在classpath根目录下
Hibernate.properties
[code]
connection.driver_class=org.hsqldb.jdbcDriver
connection.url=jdbc:hsqldb:mem:spike
dialect=org.hibernate.dialect.HSQLDialect
[/code]
User.java
[code]
public class User extends Entity<User> {
public String username;
public String password;
}
[/code]
业务类
Authentication.java
[code]
@Reborn
public class Authentication {
public static void register(String username, String password) {
User user = new User();
user.username = username;
user.password = password;
user.save();
}
public static boolean login(String username, String password) {
User user = new User();
return user.find(user.username == username, user.password == password).size() > 0;
}
}
[/code]
演示代码
RebornDemo.java
[code]
public class RebornDemo {
private void demo() {
System.out.println(Authentication.login("taowen", "password"));
Authentication.register("taowen", "password");
System.out.println(Authentication.login("taowen", "password"));
}
public static void main(String[] args) throws IOException {
new RebornDemo().demo();
}
}
[/code]
恩,这就是所有的代码了。能够想到的在语法上更进一步的就是把extends Entity变成implements Entity,但是这样的化必须用User.create() 来替换new User()了。
简化的地方:
1、Id字段自动插入
2、Entity自动标识
3、自动添加annotatedClass
4、hbm2ddl.auto缺省为create
5、hibernate.properties的每行自动添加hibernate.前缀
6、利用强类型的查询语法糖(user.username=="taowen")来代替基于字符串的HSQL
代价:
1、使用了强类型的查询语法糖的类要标记为reborn
2、在User和Entity之间使用了extends的关系
1、操作字节码
比如 AspectJ
2、用动态派生的类替换基类
比如 Spring AOP,Hibernate的Lazy Loading
后者能够达到的能力基本上已经被利用尽了。我感觉,要想突围,不妨就像AspectJ一样,走到字节码这个层面去。由于robbin给的挑战题目是去Active Record相关的,大家对于RoR的很多热情也投注在Active Record上,那我就从Hibernate用法简化入手吧。现在没有实现所有的功能,但是可以给大家看一个样子:
Hibernate配置文件,放在classpath根目录下
Hibernate.properties
[code]
connection.driver_class=org.hsqldb.jdbcDriver
connection.url=jdbc:hsqldb:mem:spike
dialect=org.hibernate.dialect.HSQLDialect
[/code]
User.java
[code]
public class User extends Entity<User> {
public String username;
public String password;
}
[/code]
业务类
Authentication.java
[code]
@Reborn
public class Authentication {
public static void register(String username, String password) {
User user = new User();
user.username = username;
user.password = password;
user.save();
}
public static boolean login(String username, String password) {
User user = new User();
return user.find(user.username == username, user.password == password).size() > 0;
}
}
[/code]
演示代码
RebornDemo.java
[code]
public class RebornDemo {
private void demo() {
System.out.println(Authentication.login("taowen", "password"));
Authentication.register("taowen", "password");
System.out.println(Authentication.login("taowen", "password"));
}
public static void main(String[] args) throws IOException {
new RebornDemo().demo();
}
}
[/code]
恩,这就是所有的代码了。能够想到的在语法上更进一步的就是把extends Entity变成implements Entity,但是这样的化必须用User.create() 来替换new User()了。
简化的地方:
1、Id字段自动插入
2、Entity自动标识
3、自动添加annotatedClass
4、hbm2ddl.auto缺省为create
5、hibernate.properties的每行自动添加hibernate.前缀
6、利用强类型的查询语法糖(user.username=="taowen")来代替基于字符串的HSQL
代价:
1、使用了强类型的查询语法糖的类要标记为reborn
2、在User和Entity之间使用了extends的关系