Nutz: 更可爱的反射
程序员文章站
2022-03-01 15:37:20
...
Java 的反射让我又爱又恨
比如我有一个 POJO:
如果通过反射创建它,通常要这样写:
但是,有些时候,很多人喜欢通过静态方法来创建一个对象:
那么通过反射就要这样写:
这很不通用
有没有更方便的方法?
这是我在写 Nutz 时,曾经认真考虑的一个问题。所以我创建了 Mirror。
你的 POJO 无论是通过 静态函数 还是 构造函数 创建,你都可以这样写:
这里是 Mirror 类更详细的介绍:http://code.google.com/p/nutz/wiki/lang_mirror
上述写法的缺点就是: 慢 -- 因为它不得不寻找构造函数以及静态函数
如果你打算一口气构建 1000 个对象,并且你的系统对效率要求较高,怎么办呢?
有没有更快的方法?
有
将 Borning 对象保存起来,下次直接调用,这样就能省却了每次查找 构造函数 或 静态函数 的开销。
但是这有意义吗?
它同:
有区别吗? 我完全可以将 Constructor 也保存起来嘛。
是的,如果你完全确定你的 POJO 就是通过 Constructor 构建的,使用 Borning 可能对你意义不是太大。
Borning 的意义就是
让你不再需要考虑对象是由 Constructor 构建,还是由 Method 来构建
因此,它为你提供了一个新的选择:
当你打算 通过反射 构建对象时
并且你 不确定 你的对象的构造方式将来会不会发生改变
你可以 使用 Borning
它会让你感觉,反射更可爱一些
延伸阅读
Nutz 项目 > http://nutz.googlecode.com
增强反射--Mirror > http://code.google.com/p/nutz/wiki/lang_mirror
- 爱: 是因为它的强大
- 恨: 是因为它的麻烦
比如我有一个 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