Nutz: 更可爱的反射

[b][size=large]Java 的反射让我又爱又恨[/size][/b]

[list]
[*]爱: 是因为它的[b][color=blue]强大[/color][/b]
[*]恨: 是因为它的[b][color=red]麻烦[/color][/b]
[/list]
比如我有一个 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");

[b]这很不通用[/b]

[list]
[*]我必须知道我的 POJO 到底是通过构造函数创建,还是通过静态方法创建
[*]如果 POJO 做了修改,我就得修改我的创建方法
[*]在这点上,Java 表现出了它的僵硬
[*]虽然它想通过反射带给程序员更大的灵活性
[*]这有点讽刺
[/list]

[b][size=large]有没有更方便的方法?[/size][/b]

这是我在写 [url=http://nutz.googlecode.com]Nutz[/url] 时,曾经认真考虑的一个问题。所以我创建了 [url=http://code.google.com/p/nutz/wiki/lang_mirror]Mirror[/url]。

你的 POJO 无论是通过 静态函数 还是 构造函数 创建,你都可以这样写:

Pet pet = Mirror.me(Pet.class).born("XiaoBai");

这里是 [b]Mirror[/b] 类更详细的介绍:[url]http://code.google.com/p/nutz/wiki/lang_mirror[/url]

上述写法的缺点就是: [b][color=red][size=large]慢[/size][/color][/b] -- [i][color=grey]因为它不得不寻找构造函数以及静态函数[/color][/i]

如果你打算一口气构建 1000 个对象,并且你的系统对效率要求较高,怎么办呢?

[b][size=large]有没有更快的方法?[/size][/b]

[b][color=red]有[/color][/b]

Borning<Pet> b = Mirror.me(Pet.class).getBorning("XiaoBai");
Pet pet = b.born(Lang.array("XiaoBai"));


将 Borning 对象保存起来,下次直接调用,这样就能省却了每次查找 [b]构造函数[/b] 或 [b]静态函数[/b] 的开销。

[b][size=large]但是这有意义吗?[/size][/b]

它同:

Constructor<Pet> c = Pet.class.getConstructor(String.class);
Pet pet = c.newInstance("XiaoBai");


有区别吗? 我完全可以将 Constructor 也保存起来嘛。

是的,如果你完全确定你的 POJO 就是通过 Constructor 构建的,使用 Borning 可能对你意义不是太大。

[b][size=large]Borning 的意义就是[/size][/b]

[b][color=blue]让你不再需要考虑对象是由 Constructor 构建,还是由 Method 来构建[/color][/b]

[b]因此,它为你提供了一个新的选择:[/b]

当你打算 [b]通过反射[/b] 构建对象时
并且你 [b]不确定[/b] 你的对象的构造方式将来会不会发生改变
你可以 [b][color=red]使用 Borning[/color][/b]

它会让你感觉,反射更可爱一些

[b][size=large]延伸阅读[/size][/b]

Nutz 项目 > [url]http://nutz.googlecode.com[/url]
增强反射--Mirror > [url]http://code.google.com/p/nutz/wiki/lang_mirror[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值