Java 的反射让我又爱又恨
比如我有一个 POJO:
public class Pet{
private String name;
public Pet(String name){
this.name = name;
}
public String getName(){
return name;
}
}
如果通过反射创建它,通常要这样写:
Constructor<Pet> c = Pet.class.getConstructor(String.class);
Pet pet = c.newInstance("XiaoBai");
但是,有些时候,很多人喜欢通过静态方法来创建一个对象:
public class Pet {
public static Pet create(String name) {
return new Pet(name);
}
private String name;
private Pet(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
那么通过反射就要这样写:
Method m = Pet.class.getMethod("create", String.class);
Pet pet = (Pet) m.invoke(null, "XiaoBai");
这很不通用
- 我必须知道我的 POJO 到底是通过构造函数创建,还是通过静态方法创建
- 如果 POJO 做了修改,我就得修改我的创建方法
- 在这点上,Java 表现出了它的僵硬
- 虽然它想通过反射带给程序员更大的灵活性
- 这有点讽刺
有没有更方便的方法?
这是我在写
Nutz 时,曾经认真考虑的一个问题。所以我创建了
Mirror。
你的 POJO 无论是通过 静态函数 还是 构造函数 创建,你都可以这样写:
Pet pet = Mirror.me(Pet.class).born("XiaoBai");
这里是
Mirror 类更详细的介绍:
http://code.google.com/p/nutz/wiki/lang_mirror
上述写法的缺点就是:
慢 --
因为它不得不寻找构造函数以及静态函数
如果你打算一口气构建 1000 个对象,并且你的系统对效率要求较高,怎么办呢?
有没有更快的方法?
有
Borning<Pet> b = Mirror.me(Pet.class).getBorning("XiaoBai");
Pet pet = b.born(Lang.array("XiaoBai"));
将 Borning 对象保存起来,下次直接调用,这样就能省却了每次查找
构造函数 或
静态函数 的开销。
但是这有意义吗?
它同:
Constructor<Pet> c = Pet.class.getConstructor(String.class);
Pet pet = c.newInstance("XiaoBai");
有区别吗? 我完全可以将 Constructor 也保存起来嘛。
是的,如果你完全确定你的 POJO 就是通过 Constructor 构建的,使用 Borning 可能对你意义不是太大。
Borning 的意义就是
让你不再需要考虑对象是由 Constructor 构建,还是由 Method 来构建
因此,它为你提供了一个新的选择:
当你打算
通过反射 构建对象时
并且你
不确定 你的对象的构造方式将来会不会发生改变
你可以
使用 Borning
它会让你感觉,反射更可爱一些
延伸阅读
Nutz 项目 >
http://nutz.googlecode.com
增强反射--Mirror >
http://code.google.com/p/nutz/wiki/lang_mirror
分享到:
相关推荐
Nutz遵循Apache协议,完全开放,文档齐全,永远免费(商用也是) 完整的Mvc,Ioc,Dao,Aop,快速开发Web /桌面/嵌入式应用,无强制依赖 项目各种资源地址 秒回,就是这么爽 的企业级微服务框架,提供自动配置,...
Nutz 对于 Java 程序员来说,除 SSH 之外,的另一个选择 项目目标 在力所能及的情况下,最大限度的提高Web开发人员的生产力。 项目各种资源地址 手册地址 (发布新版本时更新) (基本做到文档有变动就更新) (新手...
nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册
Lang -- 更简洁的 Java 函数以及更丰富的反射支持 Aop -- 轻便快速的切面编程支持 Plugin -- 轻便的插件机制 Resource -- 资源扫描 它所有的功能均不依赖第三方 jar 包 这就意味着: 如果一个 Web 应用,你在 WEB-...
nutz特点: 轻 -- 当前最新版,整个 jar 文件共 910kB -- 针对 JDBC 的薄封装,无缓存 全 -- 提供了 Dao (ORM, SQL 管理), Ioc, Aop, Mvc, Json解析 等必要功能 活 -- 各个部分可以独立使用,比如在 Spring 里采用 ...
对于 Java 程序员来说,除 SSH 之外,可能还有另外一个选择: Nutz 当然,它是开源的,并且是完全免费的。 同传统的 SSH 相比,它具备如下特点: 轻 -- 当前最新版,整个 jar 文件共 820k 薄 -- 针对 JDBC 的薄封装...
更多的简化Java语法的函数和类 -- Nutz.Lang 以及 Nutz.Castors 不依赖任何第三方 Jar 包,从而便于程序员建立开发环境,部署,甚至重新编译 Nutz 的源代码。 不幸的是在第一版,我还是依赖了 Javassist 可以很好的...
用于nutz邮箱验证jar包
nutz生成javabean工具.zip
Spring 里采用 Nutz.Dao ,又比如在 Nutz.Ioc 里使用 Hibernate 等整 -- 它所有功能均不依赖第三方 jar 文件。这就意味着:如果一个 Web 应用,你在 WEB-INF/lib 下只 需要放置一个 nutz.jar 就够了当然你要使用其它...
可连接多种数据库根据表直接生成nutz所需的bean
nutz框架使用手册,从零到有深入学习nutz平台开发
nutz框架jar包
可以快速定位路径 页面 本jar包是nutz实用插件 希望大家多多下载
nutz-1.r.60.jar
在做nutz redis集成的实时,由于依赖包的问题被坑了一把,为了后人不要走同样的路,把所有依赖包放在上面了。
让nutz支持freemarker。 具体使用和在struts2中使用是一样的
nutz框架开发手册,框架很方便使用的,和大家分享
nutz-webA Jetty launcher + Nutz.Mvc Ajax View添加依赖(maven)<dependency><groupId>org.nutz</groupId><artifactId>nutz-web</artifactId><version>1.r.62</version></dependency>新建一个配置文件web....
用开源框架nutz搭建的MVC框架,适合小型系统的开发,快捷方便!