Java的重要基础!反射

理论

反射本身并不是一个新概念,它可能会使我们联想到光学中的反射概念,尽管计算机科学赋予了反射概念新的含义,但是,从现象上来说,它们确实有某些相通之处,这些有助于我们的理解。在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。可以看出,同一般的反射概念相比,计算机科学领域的反射不单单指反射本身,还包括对反射结果所采取的措施。所有采用反射机制的系统(即反射系统)都希望使系统的实现更开放。可以说,实现了反射机制的系统都具有开放性,但具有开放性的系统并不一定采用了反射机制,开放性是反射系统的必要条件。一般来说,反射系统除了满足开放性条件外还必须满足原因连接(Causally-connected)。所谓原因连接是指对反射系统自描述的改变能够立即反映到系统底层的实际状态和行为上的情况,反之亦然。开放性和原因连接是反射系统的两大基本要素。

Java中,反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是:如果使用不当,反射的成本很高。

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。

实践

在我们日常Java开发生活中经常会遇到客户要求不能重新编译重启服务器的情况,那么,这时候就是使用我们的反射的时候了。相信大家在前面的阅读中,已经对反射的理论知识有了一定的基础的了解,那么反射的Class方法该怎么用呢?接下来我们以Book类为例来进行实例讲解。

在日常开发生活中,我们需要调用BookServiceImpl里面的方法时,我们可以进行父类引用指向子类对象来进行实例化,比如:

BookService bookService = new BookServiceImpl();
        bookService.add();

但是这样的弊端也是很显然的,当我需要变更指向的子类时就需要修改源代码,这样会造成代码的重新编译和服务器的重新启动,这样显然有悖于客户的需求,这时候我们可以使用Class方法。

Class cla = Class.forName("com.fang.service.impl.BookServiceImpl");
Constructor constructor = cla.getDeclaredConstructor();
        Object obj = constructor.newInstance();

Class.forName(类的全类名)这样也是new一个对象。

这时候有同学发现了:你这步骤除了更繁琐之外没什么优点啊,而且也是需要修改源代码的啊。

稍安勿躁,这是因为我们的反射的优点还没有体现出来。因为在for Name方法中类的全类名时以参数的形式出现的,这就意味着,我们完全可以把这部分摘出来扔到配置文件中,通过文件流的方式传输参数。

 InputStream stream = Test01.class.getClassLoader().getResourceAsStream("info.properties");
        Properties p=new Properties();
        p.load(stream);
        String className = p.getProperty("className");
        String methodName = p.getProperty("methodName");
        Class cla = Class.forName(className);
        Constructor constructor = cla.getDeclaredConstructor();
        Object obj = constructor.newInstance();

这样我们需要修改为别的类时,这样去修改配置文件就行了。

小知识:

当我们方法众多时也可以使用cla.getDeclaredMethod(methodName);来获取方法名来执行方法

代码:

 String methodName = p.getProperty("methodName");
Method method = cla.getDeclaredMethod(methodName);
        method.invoke(obj);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值