反射(三)——反射技术的应用

反射技术的应用

  前面我们学习了反射机制,接下来我们就进一步来谈谈它的应用。比如我们已经定义了一个集合类,其中的

泛型为String,那我们能向该集合添加其他类型的元素吗?从java的语法上是无法做到的。

    ArrayList<String> array = new ArrayList<String>();
    array.add("String");  //向集合添加String类型
    array.add(123);       //无法添加Integer等其他数据类型

  如上代码,我们向集合里面添加String是没问题的,但是添加其他类型呢?无疑,编译是无法通过的。那怎

么办呢?在以前我们学集合的时候,曾经有过一个概念叫做伪泛型(编译后的class文件是没有泛型的),我们

可以利用这一点来寻找问题的突破口。当我们运行ArrayList<String>的时候,ArrayList.class会被调进方法区。

调进方法区后,类的加载器就会为ArrayList.class文件创建对象,该文件会被解剖,将add()方法从class文件拿

出来以后直接运行。像这种避开了对象的调用而直接加载class文件的方法能不能为我们解决上述问题呢?应该

说可以的。我们可以使用反射机制直接从方法区中直接调用。通过ArrayList.class的原码,我们发现其中的add

方法传的泛型E,所以我们可以绕过对象,直接走后门。调用这个方法。想要实现这个功能非常简单,我们通

过反射机制获取集合类的class文件对象。通过class文件对象直接调用add方法。之前我们讲过获取对象的三种

方式,所以这里就没必要forName()方法了,使用对象直接调用getClass()方法也可以实现class文件的获取。

        //创建集合
	ArrayList<String> array = new ArrayList<String>();
	//反射获取集合类中的class文件对象
	Class c = array.getClass();
	///获取文件中的方法add()
	Method method = c.getMethod("add",Object.class);
	//使用invoke()方法运行
	method.invoke(array,"string");
	method.invoke(array,100);
	method.invoke(array,100.0);
	method.invoke(array,true);
	System.out.println(array); //输出:[string, 100, 100.0, true]

  通过以上实验,我们发现这种方法是可行的,其原因在于编译后产生class文件是无泛型约束的,这种现象

称之为泛型的擦除。既然如此,我们就可以利用反射技术来向有泛型约束的集合添加任意类型,所以泛型在这

中技术中已经显得不是很重要了。这里还要特殊的强调一下,当我们往集合中添加了任意类型元素后,首先我

们想到的问题是,它能遍历吗?答案我们都很清楚,不能。所以往集合中添加任意多种类型没有实用的价值。

这里之所以这样做是考察我们是否理解在集合中使用反射技术。

  反射技术还可以用于反射文件的配置。比如我们现在有很多个类,但是类的使用是不清楚的,模糊的,可

能是随着需求的变化而变化。而我们又怕修改原码,解决这个方法就可以通过配置文件来实现。反射文件的配

置规定运行的类名和方法名以键值对的形式写在文本中。而我们想要运行某个类的时候,就可以读取配置文即

可。反射技术的优势之处在于类名和方法名都可以以字符串的形式表示。反射文件配置的基本步骤如下:

    1.准备配置文件

在eclipse工程的根目录下创建File文件,不妨就叫config.properties,在config.properties文件中配置如下内容:

    className = com.gzhxtc.win.Goods
    methodName = goods

  

    2.IO流读取配置文件(Reader)

  在应用类里使用IO流读取配置文件,需要注意的是在工程的根目录下文件名不需要写配置文件的全路径

    //IO流读取配置文件
    FileReader fleReader = new FileReader("config.properties");

  

    3.将文件中的键值对存储到集合中(Properties)

    //创建集合对象
    Properties properties = new Properties();
    //调用集合的load方法,传递流对象
    properties.load(fleReader);
    fleReader.close();

  

    4. 使用反射技术

    //通过Key获取Value
    String className = properties.getProperty("className");
    String methodName = properties.getProperty("methodName");
    //反射获取类的class文件对象
    Class c = Class.forName(className);
    Object obj = c.newInstance();
    Method method = c.getMethod(methodName);
    method.invoke(obj);

  所以通过以上的例子,我们不难发现这种方式根本不需要修改原码,只需要修改配置文件就行。现代写代

码的基本形式已经趋向于反射的形式了。在上面的配置文件中可以在里面配置多个键值对,把不用的键值对用

“#”进行注释,等想用的使用在解放注释。如果多个键值对没有进行注释,集合会将前面的键值对进行覆盖,最

后只剩下最后一个。这一点是我们需要注意的。

原文地址:https://www.cnblogs.com/Lynnblog/p/8963727.html

时间: 2024-11-09 12:54:26

反射(三)——反射技术的应用的相关文章

Java进阶之reflection(反射机制)——反射概念与基础

反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见的JavaScript就是动态语言,除此之外Ruby,Python等也属于动态语言,而C.C++则不属于动态语言. 二.Java是动态语言吗? 从动态语言能在运行时改变程序结构结构或则变量类型上看,Java和C.C++一样都不属于动态语言. 但是JAVA却又一个非常突出的与动态相关的机制:反射机制.

java反射(四)--反射与简单java类

一.传统简单java类 简单的java类主要是由属性所组成,并且提供有相应的setter以及getter的处理方法,同时简单java类最大的特征就是通过对象保存相应的类的属性内容,但是如果使用传统的简单java类的开发,那么也会面临非常麻烦的困难: 1 class Emp{ 2 private String ename; 3 private String job; 4 5 public void setEname(String ename) { 6 this.ename = ename; 7 }

什么是反射?反射有什么用处

什么是反射?反射有什么用处? 1. 什么是反射? “反射(Reflection)能够让运行于JVM中的程序检测和修改运行时的行为.”这个概念常常会和内省(Introspection)混淆,以下是这两个术语在Wikipedia中的解释: 内省用于在运行时检测某个对象的类型和其包含的属性: 反射用于在运行时检测和修改某个对象的结构及其行为. 从它们的定义可以看出,内省是反射的一个子集.有些语言支持内省,但并不支持反射,如C++. 内省示例:instanceof 运算符用于检测某个对象是否属于特定的类

阿里云大数据三次技术突围:Greenplum、Hadoop和“飞天”

阿里云大数据三次技术突围:Greenplum.Hadoop和"飞天"  对于企业来说,到底什么是云计算?相信很多企业都有这样的困惑,让我们一起回到这个原始的起点探讨究竟什么是云计算?云计算对于企业而言到底意味什么? 云计算的三条发展路径及三种落地形态 当回到最初的起点再审视云计算的发展路径,可以发现,经过十余年的发展演进,云计算有三条发展路径,并且最终沉淀下来了三种落地形态. 第一条路:源自于谷歌对大规模数据的处理,谷歌为全球的互联网用户提供同一个服务--搜索,它需要将全世界所有的网站

谈谈在DevOps实践中,感觉最重要的这三个技术……

从国内众多DevOps实践中,我们能看到下面三个技术尤其重要和火热: 容器:容器从根本上解决了软件对环境的依懒性,解决了各个环境之间的差异问题:它可以加速部署的速度,提高部署的效率:降低部署的成本.容器技术是在Linux的基础之上发展起来的,因此它本身的实施成本很低,就是在任何物理机和虚拟机的Linux操作系统上安装Docker服务(仅几十兆)就可以完成所有功能.在任何环境中实施Docker需要考虑好以下几个因素:主机的计算资源特性和容器允许的资源需求相匹配(计算密集型.内存密集型.IO密集型等

ASP、JSP、PHP 三种技术比较

ASP.JSP.PHP 三种技术比较 目前,最常用的三种动态网页语言有ASP(Active Server Pages),JSP(JavaServer Pages),PHP (Hypertext Preprocessor). 简 介 : ASP全名Active Server Pages,是一个WEB服务器端的开发环境,利用它可以产生和执行动态的.互动的.高性能的WEB服务应用程序.ASP采用脚本语言VBScript(Java script)作为自己的开发语言. PHP是一种跨平台的服务器端的嵌入式

【16.09.01】【三零技术】最新更新文章推荐

1.[PHP编程:PHP简单无限分类类代码] 简介:这里就不多解释原理了,直接发代码.PS:这里代码是不能直接使用的,必须结合我的一些其他库类.应该说思想才是最重要的,这里主要提供一种分类的思路.... 地址:http://www.q3060.com/list3/list117/34130.html 2.[PHP编程:PHP简单的采集程序] 简介:    (修改了下,增加了数据缓存功能..汗,没有使用lite_cache了,自己写了个最简单的那种..)                      

关于PHP、JAVA、.NET这三种技术的区别

关于PHP.JAVA..NET这三种技术的区别 一.语言: PHP:PHP产生与1994年,其语法混合了C.Java.Perl 和他自创的一些编程语法:PHP是嵌入在HTML中执行的:它也是一种解释性语言.早期的PHP并非完全的面向对象编程语言,到了PHP4以后的版本才开始有了面向对象的概念. JAVA:JAVA产生与1995年,JAVA语言和JAVA平台统称为JAVA:它语法与C语言和C++语言很接近,并且JAVA是面向对象编程语言,JAVA是编译性语言,可以先将JAVA源码编译成.class

反射——Java反射机制

反射概述 什么是反射? ①   反射的概念是由Smith在1982年首次提出的,主要指程序可以访问.检测和修改它本身状态或行为的一种能力. ②   JAVA反射机制是在运行状态中,对应任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种状态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制. ③   简单的说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息.包括其访问

源代码加密软件的三种技术 你了解多少?

所谓源代码加密软件是指以源代码文件为对象,采用数据泄露防护技术,有效防止源代码文件泄露和扩散,它主要起源于传统数据防泄密市场.到目前为止很多人对软件源代码加密技术的了解还不够深,随着技术不断升级软件源代码加密技术经历了传统透明加密技术.边缘沙盒防泄密技术以及革新DSA数据安全隔离数据等,接下来几维安全将为大家详细介绍这三种技术,一起去看看. 传统透明加密技术 透明加密技术典型代表即文档加密软件,其核心在于文档创建时即加密,并与用户.权限相结合.加密后,授权用户正常双击打开使用,非授权用户则显示为