论坛凯发推荐首页 java企业应用论坛

nutz: 更可爱的反射 -欧洲杯足彩官网

浏览 11449 次
精华帖 (7) :: 良好帖 (3) :: 新手帖 (3) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-29   最后修改:2010-01-29
java 的反射让我又爱又恨

  • 爱: 是因为它的强大
  • 恨: 是因为它的麻烦

    比如我有一个 pojo:

public class pet{
    private string name;
    public pet(string name){
        this.name = name;
    }
    public string getname(){
        return name;
    }
}

    如果通过反射创建它,通常要这样写:

constructor 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 表现出了它的僵硬
  • 虽然它想通过反射带给程序员更大的灵活性
  • 这有点讽刺


有没有更方便的方法?

    这是我在写 时,曾经认真考虑的一个问题。所以我创建了 。

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

pet pet = mirror.me(pet.class).born("xiaobai");

    这里是 mirror 类更详细的介绍:

    上述写法的缺点就是: -- 因为它不得不寻找构造函数以及静态函数

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

有没有更快的方法?

   

borning b = mirror.me(pet.class).getborning("xiaobai");
pet pet = b.born(lang.array("xiaobai"));


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

但是这有意义吗?

    它同:

constructor c = pet.class.getconstructor(string.class);
pet pet = c.newinstance("xiaobai");


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

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

borning 的意义就是

让你不再需要考虑对象是由 constructor 构建,还是由 method 来构建

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

             当你打算 通过反射 构建对象时
                  并且你 不确定 你的对象的构造方式将来会不会发生改变
                       你可以 使用 borning
  
它会让你感觉,反射更可爱一些

延伸阅读

    nutz 项目 >
    增强反射--mirror >

 
   发表时间:2010-01-29  
我喜欢糖,喜欢简单直接,更喜欢简单粗暴,哈哈
请登录后投票
   发表时间:2010-01-29  
对啊, 这是nutz其中一个很好的东西!
请登录后投票
   发表时间:2010-01-29  
正在看中。。。
请登录后投票
   发表时间:2010-01-29  
我认为楼主还没有真正理解反射的意义所在,如果反射都是你这么用,确实很糟糕
请登录后投票
   发表时间:2010-01-29   最后修改:2010-01-29
那你怎么实现构造对象的!!!!
如果你的实现只是封装了java反射的功能的话,实在是多次一举,难道你直接操作了字节码,不好意思,我没看你的源码!!
请登录后投票
   发表时间:2010-01-29  
反射是很强大,但是毕竟是耗资源的操作,能少用就少用吧
请登录后投票
   发表时间:2010-01-29  
详细的看了下包装后的反射, 我实在没有了解到lz所阐述的“好处”
或者这个只是nutz中的微不足道的一小部分?
请登录后投票
   发表时间:2010-01-29  
技术滥用,闲的无聊。
请登录后投票
   发表时间:2010-01-30  
说实在的,我觉得语言提供反射机制是一种倒退。反射连鸡肋都算不上。
请登录后投票
global site tag (gtag.js) - google analytics
网站地图