浅谈 java 反射机制
一:Java反射概念
Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。
Java反射机制容许程序在运行时加载、探知、使用编译期间完全未知的classes。换言之,Java可以加载一个运行时才得知名称的class,获得其完整结构。
简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息。
二:什么时候用到反射机制
当你只有一个类的定义,但是不能显式地创建一个类的时候,就需要使用反射机制来操作。
一个最简单的例子就是jdbc编程中加载类驱动就是通过反射机制来实现的:Class.forName("com.MySQL.jdbc.Driver.class").newInstance();
现在很多开 框架都用到反射机制,hibernate、struts都是用反射机制实现的。
三:反射机制能够获取哪些信息
一句话,类中有什么信息,它就可以获得什么信息,不过前提是得知道类的名字,要不就没有后文了
    首先得根据传入的类的全名来创建Class对象。
    Class c=Class.forName("className");注明:className必须为全名,也就是得包含包名,比如,cn.netjava.pojo.UserInfo;
    Object obj=c.newInstance();//创建对象的实例 
    OK,有了对象就什么都好办了,想要什么信息就有什么信息了。
1.  获取类的方法
    1.1)Method getMethod(String name, Class[] params),根据方法名,参数类型获得方法
1.2)Method[] getMethods()//获得所有的public方法
1.3)Method getDeclaredMethod(String name, Class[] params)//根据方法名和参数类型,获得public和非public的方法
1.4)Method[] getDeclaredMethods()//获得所以的public和非public方法
    2. 获取类的构造函数
    2.1)Constructor getConstructor(Class[] params)//根据指定参数获得public构造器
2.2)Constructor[] getConstructors()//获得public的所有构造器
2.3)Constructor getDeclaredConstructor(Class[] params)//根据指定参数获得public和非public的构造器
2.4) Constructor[] getDeclaredConstructors()//获得public的所有构造器
    3. 获取类的属性
    3.1)Field getField(String name)//根据变量名得到相应的public变量
3.2)Field[] getFields()//获得类中所以public的方法
3.3)Field getDeclaredField(String name)//根据方法名获得public和非public变量
3.4)Field[] getDeclaredFields()//获得类中所有的public和非public方法
   4.获取类的Class对象
4.1)调用getClass---------Boolean var1 = true;Class<?> classType2 = var1.getClass();
4.2)运用.class 语法-----Class<?> classType4 = Boolean.class;System.out.println(classType4);
4.3)运用static method Class.forName()---Class<?> classType5 = Class.forName("java.lang.Boolean");System.out.println(classType5);
4.4)运用primitive wrapper classes的TYPE 语法-------Class<?> classType3 = Boolean.TYPE;System.out.println(classType3);
四:反射机制的优点与缺点
为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念,
    静态编译:在编译时确定类型,绑定对象,即通过。
    动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。
    一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能 的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。
       它的缺点,第一个是性能问题。当用于字段和方法接入时反射要远慢于直接代码。性能问题的程度取决于程序中是如何使用反射的。如果它作为程序运行中相对很少涉及的部分,缓慢的性能将不会是一个问题。即使测试中最坏情况下的计时图显示的反射操作只耗用几微秒。仅反射在性能关键的应用的核心逻辑中使用时性能问题才变得至关重要。许多应用更严重的一个缺点是使用反射会模糊程序内部实际要发生的事情。程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术会带来维护问题。反射代码比相应的直接代码更复杂,正如性能比较的代码实例中看到的一样。解决这些问题的最佳方案是保守地使用反射-- 仅在它可以真正增加灵活性的地方 -- 记录其在目标类中的使用。
参考资料:
http://champion-netjava-163-com.iteye.com/blog/982080
http://www.cnblogs.com/Quincy/archive/2011/06/19/2084557.htm
http://zlb1986.iteye.com/blog/937781
http://jspengxue.iteye.com/blog/39945
浅谈 java 反射机制的更多相关文章
- 浅谈java反射机制
		
目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...
 - 浅谈Java反射机制 之 使用类的 属性、方法和构造函数
		
前面两篇我们总结了Java反射机制如何获取类的字节码,如何获取构造函数,属性和方法, 这篇我们将进一步验证如何使用我们获取到的属性.方法以及构造函数 1.使用 反射 获取到的 属性 import ja ...
 - 浅谈Java反射机制 之 获取类的字节码文件 Class.forName("全路径名") 、getClass()、class
		
另一个篇:获取 类 的 方法 和 属性(包括构造函数) 先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它 ...
 - 浅谈Java反射机制 之 获取类的 方法 和 属性(包括构造函数)
		
上一篇 获取 类 的字节码文件 我们讲到了获取类的字节码文件的三种方法 第三种方法通过getClass("全路径名")获取字节码文件最符合要求 1.获取构造方法 先贴上我们要获取的 ...
 - 浅谈java发射机制
		
目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...
 - Java -- 浅入Java反射机制
		
1,Java 反射是Java语言的一个很重要的特征,它使得Java具体了"动态性". Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类. 在运行时构造任意一 ...
 - 浅谈Java反射
		
什么是反射? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语 ...
 - 浅谈Java反射与框架
		
Java反射 1.示例 1.用户类 package com.lf.entity; import com.lf.annotation.SetProperty; import com.lf.annotat ...
 - 浅谈java编译机制和运行机制
		
源文件和字节码的组成方式 源文件: 拓展名后跟java的文件即java的源文件. Java 源码编译由以下三个过程组成: 1.分析和输入到符号表 2.注解处理 3.语义分析和生成class文件 流程图 ...
 
随机推荐
- Fiddler4抓包工具使用教程一
			
本文参考自http://blog.csdn.net/ohmygirl/article/details/17846199,纯属读书笔记,加深记忆 1.抓包工具有很多,为什么要使用Fiddler呢?原因如 ...
 - Jmeter环境搭建
			
一.工具描述 Apache JMeter是 100 %的 java 桌面应用程序.它可以被用来测试包括基于静态和动态资源程序的性能,例如静态文件, Java Servlets , Java 对象,数 ...
 - java aop做一个接口耗时的计算
			
看代码: @Aspect @Component public class TimeCostAspect { private static Logger logger = LoggerFactory.g ...
 - Integer.parseInt() 和 valueOf()
			
parseInt("1")返回的是int类型,所以如果想要将一个String类型的数字串转为原始类型int ,建议使用这个方法, 而不是使用 valueOf("1&quo ...
 - vue  监听对象里的特定数据
			
vue 监听对象里的特定数据变化 通常是这样写的,只能监听某一个特定数据 watch: { params: function(val) { console.log(val) this.$ajax.g ...
 - 用java做操作系统内核:软盘读写
			
在前两节,我们将一段代码通过软盘加载到了系统内存中,并指示cpu执行加入到内存的代码,事实上,操作系统内核加载也是这么做的.只不过我们加载的代码,最大只能512 byte, 一个操作系统内核,少说也要 ...
 - The best career advice I’ve received --转载
			
http://www.nczonline.net/blog/2013/10/15/the-best-career-advice-ive-received/ The best career advice ...
 - 配置jenkins slave 问题,ERROR: Couldn't find any revision to build. Verify the repository and branch configuration for this job.
			
因为需要需要搭建一套自动化环境的windows电脑作为slave,简单的把原来用来mac上的job配置一模一样的配置了下,运行时遇到如上问题,google半天百思不得其解, 后来尝试把SCM里面的br ...
 - bzoj 4912: [Sdoi2017]天才黑客
			
Description Solution 这个题和点没什么关系 , 之和边与边之间关系有关 , 我们就把边看作点 , 边权就是 \(lcp\) , 点权看作这条边本来的权值. 现在考虑两两连边 , \ ...
 - Mysql5.5升级到5.6步骤详解 小版本大版本
			
http://blog.csdn.net/i_team/article/details/9935693 小版本升级,先关闭数据库,然后mv直接全部替换掉mysql目录下的bin/ ,lib/ ,sha ...