`
zozoh
  • 浏览: 61549 次
  • 性别: 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代码生成器是Nutz框架下提高开发效率的有效工具,通过它,你可以快速搭建起基于Nutz的业务系统,节省时间和精力,更专注于业务功能的创新与优化。在实际开发中,结合Nutz的其他特性,如事务管理、拦截器、...

    nutz学习资料2

    8. **源码阅读**:了解Nutz框架的源码,可以帮助我们更好地理解和定制框架,提高开发效率。 通过阅读老孟的博客和LendingCloud的表格规范,我们可以结合实际案例来学习这些知识点,从而提升我们的Nutz开发技能。...

    基于Java全栈开发的Nutz框架:Mvc/Ioc/Aop/Dao/Json一体化设计源码

    该项目为全栈Java开发,采用Nutz框架实现Mvc/Ioc/Aop/Dao/Json一体化设计,源码包含2307个文件,涵盖1742个Java源文件、208个man文档、143个png图片、47个jpg图片、22个js脚本、21个psd设计文件、16个xml文件、13个...

    nutz框架使用手册.zip

    5. **实战示例**:手册可能包含多个实际开发案例,如CRUD操作、表单验证、文件上传下载、AJAX交互等,帮助读者通过实践更好地理解和掌握Nutz框架的使用。 6. **性能优化**:对于大型项目,性能优化至关重要。手册...

    nutz_redis集成依赖包

    Nutz的目标是简化开发流程,提高开发效率,使开发者更专注于业务逻辑。 2. **Redis**:Redis是一个高性能的内存数据结构服务器,它支持多种数据结构如字符串、哈希、列表、集合和有序集合,常用于缓存、消息中间件...

    Nutz开发用到的jar包

    1. **Nutz Core**:这是Nutz框架的基础,包含了I/O、网络、反射、线程等核心功能。它提供了许多实用工具类,简化了Java开发中的常见任务,如对象转换、日期处理等。 2. **Nutz MVC**:Nutz MVC是Nutz框架的一个重要...

    nutz初使用之MVC HelloWorld (netbeans jsp版)

    implementation 'org.nutz:nutz-boot-starter-web-jetty:最新版本号' ``` 3. **配置Nutz MVC** - 在项目根目录下创建一个`src/main/resources/nutz/app.properties`文件,这是Nutz的配置文件。添加以下基本配置...

    nutz迷你项目

    【标题】:“Nutz迷你项目” “Nutz迷你项目”是一个基于Nutz框架的小型项目实例,旨在帮助开发者快速理解和...通过查看和分析这些文件,你可以更深入地了解Nutz框架的运用,以及如何在实际项目中灵活运用这些知识。

    nutz框架开发手册

    6. **Lang模块**:增强了Java语言的功能,提供了更简洁的函数以及丰富的反射支持,提高了代码的可读性和可维护性。 7. **Aop模块**:支持轻量级的面向切面编程,允许开发者以较少的侵入性实现横切关注点的分离。 8...

    nutz需要的jar包

    Nutz是一个轻量级、高性能的Java开发框架,它提供了丰富的功能,包括MVC、ORM、DAO、AOP、IOC等,使得Java开发者能够快速地构建应用系统。本篇文章将详细探讨Nutz框架中所需的jar包以及它们在项目中的作用。 首先,...

    nutz的freemarker视图插件

    - 主要的区别在于Nutz的轻量级特性,它的MVC模型可能比Struts2更简单,但功能同样强大。 5. **最佳实践**: - 将业务逻辑与视图逻辑分离,模板只负责展示,不涉及复杂的计算。 - 合理组织模板文件结构,提高可...

    nutz搭建的MVC框架

    Nutz是一个轻量级、高性能的Java开源框架,它提供了丰富的功能,包括MVC(Model-View-Controller)架构支持,使得开发者能够快速构建小型到中型的Web应用。本篇文章将详细介绍如何利用Nutz搭建MVC框架,并探讨其在...

    nutz-1.r.58

    通过这个Javadoc,开发者可以快速查找并了解Nutz框架中的各个类和方法,从而更好地进行代码编写。 2. `nutz-1.r.58.jar`:这是Nutz框架的核心库文件,包含了框架的所有功能模块。将此jar包添加到项目的类路径中,...

    nutz生成javabean工具.zip

    作为Nutz框架的一部分,Nutz Codematic可以无缝地与其他Nutz组件(如Nutz ORM)结合使用,实现更高效的开发流程。例如,生成的JavaBean可以直接用于Nutz ORM进行数据库操作,简化数据访问层的开发。 6. **学习与...

    nutz 文件上传例子

    综上所述,"nutz 文件上传例子" 主要涵盖了使用 Nutz 框架进行文件上传的基本操作,包括配置、接收文件、处理文件以及利用 `nutz.plugin.multiupload` 插件进行更复杂的上传场景。在实际开发中,还需要关注文件安全...

    nutz-1.r.62.zip

    5. `manual`:可能是一个子目录,包含了更多关于Nutz框架的详细教程或者补充文档,可能是Markdown、HTML或其他格式。 Nutz框架的核心特性包括: 1. **MVC模式**:Nutz提供了一个轻量级的MVC(Model-View-...

Global site tag (gtag.js) - Google Analytics