`
zozoh
  • 浏览: 59073 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Nutz: 更可爱的反射

    博客分类:
  • nutz
阅读更多
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

分享到:
评论
20 楼 huanghanjun 2010-02-07  
反射好像现在很少用了
19 楼 拥抱变化之美 2010-02-02  
很好,但是效率差。
18 楼 nenyalanye_1 2010-02-01  
hommy8 写道
mycybyb 写道
javaonejcy 写道
java的反射机制是必须有的不是可有可无的,因为虚拟机从磁盘加载类文件就需要用到这个机制。

在这里这个真不是必须的,我写过一个JVM,就是没有实现反射。

高手,自己实现JVM

自己写jvm。H手
17 楼 hommy8 2010-02-01  
mycybyb 写道
javaonejcy 写道
java的反射机制是必须有的不是可有可无的,因为虚拟机从磁盘加载类文件就需要用到这个机制。

在这里这个真不是必须的,我写过一个JVM,就是没有实现反射。

高手,自己实现JVM
16 楼 mycybyb 2010-02-01  
javaonejcy 写道
java的反射机制是必须有的不是可有可无的,因为虚拟机从磁盘加载类文件就需要用到这个机制。

在这里这个真不是必须的,我写过一个JVM,就是没有实现反射。
15 楼 binlaniua 2010-01-31  
用反射可以使系统的扩展性更强

便于后期需求的更别进行扩展
14 楼 javaonejcy 2010-01-31  
java的反射机制是必须有的不是可有可无的,因为虚拟机从磁盘加载类文件就需要用到这个机制。所以这个机制的性能如果存在问题那我们也是毫无办法的。这种机制比直接调用慢那是肯定的,因为直接调用应该是调用的被虚拟机缓存起来的结果。所以,如果你大量地方要用反射,那么把部分重复操作缓存起来是合理的可行的。
13 楼 trace 2010-01-30  
truekbcl 写道
说实在的,我觉得语言提供反射机制是一种倒退。反射连鸡肋都算不上。

Java如果没有反射,那才是鸡肋!
12 楼 wendal 2010-01-30  
beeke 写道
nutz的mirror是把创建对象的过程做了一种抽象,单独拿出来没有太大意义,但是用在nutz里却恰到好处。

看nutz的源码,反射实在是的太多了,Lang、Mirror和Castors的反射简直是无所不在。
而这些库都是作为底层基础库存在的。
从一次http请求到mvc到ioc到dao,这个过程势必会调用多次底层库。
zozoh有没有测试过这个性能?


当你的确遇到性能问题的时候才应该考虑之,反射用得其所是没什么问题的.
反射的确比直接调用慢, 但是, 实际差异并不明显,除非你有确凿证据表明性能瓶颈出在反射上.
单单做几个循环得出一些数据,就能说明性能好坏吗?

Nutz正在为自身开发一个简洁的字节码工具,到时候也会大大减少反射的使用.
11 楼 beeke 2010-01-30  
nutz的mirror是把创建对象的过程做了一种抽象,单独拿出来没有太大意义,但是用在nutz里却恰到好处。

看nutz的源码,反射实在是的太多了,Lang、Mirror和Castors的反射简直是无所不在。
而这些库都是作为底层基础库存在的。
从一次http请求到mvc到ioc到dao,这个过程势必会调用多次底层库。
zozoh有没有测试过这个性能?
10 楼 dtzleg 2010-01-30  
没反射,ioc就没法写那么简洁了。。。
9 楼 truekbcl 2010-01-30  
说实在的,我觉得语言提供反射机制是一种倒退。反射连鸡肋都算不上。
8 楼 曾经de迷茫 2010-01-29  
技术滥用,闲的无聊。
7 楼 liu78778 2010-01-29  
详细的看了下包装后的反射, 我实在没有了解到LZ所阐述的“好处”
或者这个只是nutz中的微不足道的一小部分?
6 楼 dieslrae 2010-01-29  
反射是很强大,但是毕竟是耗资源的操作,能少用就少用吧
5 楼 kjj 2010-01-29  
那你怎么实现构造对象的!!!!
如果你的实现只是封装了java反射的功能的话,实在是多次一举,难道你直接操作了字节码,不好意思,我没看你的源码!!
4 楼 zuiyanwangyue 2010-01-29  
我认为楼主还没有真正理解反射的意义所在,如果反射都是你这么用,确实很糟糕
3 楼 wukele 2010-01-29  
正在看中。。。
2 楼 wendal 2010-01-29  
对啊, 这是nutz其中一个很好的东西!
1 楼 nwangwei 2010-01-29  
我喜欢糖,喜欢简单直接,更喜欢简单粗暴,哈哈

相关推荐

    nutz:Nutz-适用于所有Java开发人员的Web框架(MvcIocAopDaoJson)

    Nutz遵循Apache协议,完全开放,文档齐全,永远免费(商用也是) 完整的Mvc,Ioc,Dao,Aop,快速开发Web /桌面/嵌入式应用,无强制依赖 项目各种资源地址 秒回,就是这么爽 的企业级微服务框架,提供自动配置,...

    nutz:从 code.google.compnutz 自动导出

    Nutz 对于 Java 程序员来说,除 SSH 之外,的另一个选择 项目目标 在力所能及的情况下,最大限度的提高Web开发人员的生产力。 项目各种资源地址 手册地址 (发布新版本时更新) (基本做到文档有变动就更新) (新手...

    nutz 使用手册 nutz-1.a.33-manual.pdf

    nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册

    nutz-1.b.52.zip

    Lang -- 更简洁的 Java 函数以及更丰富的反射支持 Aop -- 轻便快速的切面编程支持 Plugin -- 轻便的插件机制 Resource -- 资源扫描 它所有的功能均不依赖第三方 jar 包 这就意味着: 如果一个 Web 应用,你在 WEB-...

    nutz pdf学习文档

    nutz特点: 轻 -- 当前最新版,整个 jar 文件共 910kB -- 针对 JDBC 的薄封装,无缓存 全 -- 提供了 Dao (ORM, SQL 管理), Ioc, Aop, Mvc, Json解析 等必要功能 活 -- 各个部分可以独立使用,比如在 Spring 里采用 ...

    Nutz框架文档

    对于 Java 程序员来说,除 SSH 之外,可能还有另外一个选择: Nutz 当然,它是开源的,并且是完全免费的。 同传统的 SSH 相比,它具备如下特点: 轻 -- 当前最新版,整个 jar 文件共 820k 薄 -- 针对 JDBC 的薄封装...

    高效,小巧的开源JAVA WEB 开发框架-Nutz (源码,开发文档)

    更多的简化Java语法的函数和类 -- Nutz.Lang 以及 Nutz.Castors 不依赖任何第三方 Jar 包,从而便于程序员建立开发环境,部署,甚至重新编译 Nutz 的源代码。 不幸的是在第一版,我还是依赖了 Javassist 可以很好的...

    nutz邮箱验证jar包

    用于nutz邮箱验证jar包

    nutz生成javabean工具.zip

    nutz生成javabean工具.zip

    Nutz-1.b.38

    Spring 里采用 Nutz.Dao ,又比如在 Nutz.Ioc 里使用 Hibernate 等整 -- 它所有功能均不依赖第三方 jar 文件。这就意味着:如果一个 Web 应用,你在 WEB-INF/lib 下只 需要放置一个 nutz.jar 就够了当然你要使用其它...

    nutz代码生成器

    可连接多种数据库根据表直接生成nutz所需的bean

    nutz框架使用手册.zip

    nutz框架使用手册,从零到有深入学习nutz平台开发

    nutz-1.r.58

    nutz框架jar包

    nutz插件 定位页面路径

    可以快速定位路径 页面 本jar包是nutz实用插件 希望大家多多下载

    nutz-1.r.60.jar

    nutz-1.r.60.jar

    nutz_redis集成依赖包

    在做nutz redis集成的实时,由于依赖包的问题被坑了一把,为了后人不要走同样的路,把所有依赖包放在上面了。

    nutz的freemarker视图插件

    让nutz支持freemarker。 具体使用和在struts2中使用是一样的

    nutz框架开发手册

    nutz框架开发手册,框架很方便使用的,和大家分享

    nutz-web:码头发射器

    nutz-webA Jetty launcher + Nutz.Mvc Ajax View添加依赖(maven)&lt;dependency&gt;&lt;groupId&gt;org.nutz&lt;/groupId&gt;&lt;artifactId&gt;nutz-web&lt;/artifactId&gt;&lt;version&gt;1.r.62&lt;/version&gt;&lt;/dependency&gt;新建一个配置文件web....

    nutz搭建的MVC框架

    用开源框架nutz搭建的MVC框架,适合小型系统的开发,快捷方便!

Global site tag (gtag.js) - Google Analytics