作者:nnngu

GitHub:https://github.com/nnngu

博客园:http://www.cnblogs.com/nnngu

简书:https://www.jianshu.com/users/1df20d76ea5c

知乎:https://www.zhihu.com/people/nnngu/posts


这篇文章要总结java的反射机制,将从以下几点进行总结:

一、什么是反射机制

二、哪里用到反射机制

三、反射机制的优点与缺点

四、利用反射机制能获得什么信息

五、反射创建对象的三种方式

一、什么是反射机制

简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在 java 中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。

二、哪里用到反射机制

有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,比如在学jdbc时用过这一行代码, Class.forName("com.mysql.jdbc.Driver.class").newInstance();

但是那时候只知道这行代码是生成驱动对象实例,并不知道它的具体含义。学习了反射机制之后才知道,原来这就是反射,现在很多开源框架都用到反射机制,spring、hibernate、struts都是用反射机制实现的。

三、反射机制的优点与缺点

为什么要用反射机制?直接创建对象不就可以了吗?这就涉及到了动态与静态的概念。

静态编译:在编译时确定类型,绑定对象。

动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,由此降低类之间的藕合性。

一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中,它的灵活性就表现的十分明显。

比如,一个大型的软件,不可能一次就把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。

它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。

四、利用反射机制能获得什么信息

一句话,类中有什么信息,它就可以获得什么信息,不过前提是得知道类的名字,要不然就没有后文了。

首先得根据传入的类的全名来创建Class对象。Class c=Class.forName("className");

注明:className必须为全名,也就是要包含包名,比如,cn.netjava.pojo.UserInfo;

Object obj=c.newInstance(); // 创建对象的实例

OK,有了对象就什么都好办了,想要什么信息就有什么信息了。

获得构造器的方法

Constructor getConstructor(Class[] params) // 根据指定参数获得public构造器

Constructor[] getConstructors() // 获得public的所有构造器

Constructor getDeclaredConstructor(Class[] params) // 根据指定参数获得public和非public的构造器

Constructor[] getDeclaredConstructors() // 获得public的所有构造器

获得方法的方法

    Method getMethod(String name, Class[] params) // 根据方法名,参数类型获得方法

    Method[] getMethods() // 获得所有的public方法

    Method getDeclaredMethod(String name, Class[] params) // 根据方法名和参数类型,获得public和非public的方法

    Method[] getDeclaredMethods() // 获得所以的public和非public方法

获得类中属性的方法

    Field getField(String name) // 根据变量名得到相应的public变量

    Field[] getFields() // 获得类中所以public的方法

    Field getDeclaredField(String name) // 根据方法名获得public和非public变量

    Field[] getDeclaredFields() // 获得类中所有的public和非public方法

常用的就这些,知道这些,其他的都好办……

五、反射创建对象的三种方式

// 创建对象的方式一:( 对象.getClass() )
Class class1 = p1.getClass(); // 创建对象的方式二:( 类.class 需要一个明确的类 )
Class class2 = Person.class; // 创建对象的方式三:( Class.forName() 传入时需要以字符串的方式传入 )
Class class3 = Class.forName("com.Person"); // 异常ClassNotFoundException

014 Java的反射机制的更多相关文章

  1. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  2. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  3. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  4. java笔记--反射机制之基础总结与详解

    一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...

  5. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

  6. java笔录---反射机制(1)

    引言   为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架,   像spring中核心模块IO ...

  7. Java高新技术 反射机制

     Java高新技术 反射机制 知识概要:                   (1)反射的基石 (2)反射 (3)Constructor类 (4)Field类 (5)Method类 (6)用反射方 ...

  8. java的反射机制浅谈(转)

    原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...

  9. 【转】Java利用反射机制访问私有化构造器

    Java利用反射机制访问私有化构造器 博客分类: java   我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...

随机推荐

  1. 简单字典实现(KV问题)

    搜索二叉树基本概念请看上篇博客 这两个问题都是典型的K(key)V(value)问题,我们用KV算法解决. 判断一个单词是否拼写正确:假设把所有单词都按照搜索树的性质插入到搜索二叉树中,我们判断一个单 ...

  2. SpringMVC 完美解决PUT请求参数绑定问题(普通表单和文件表单)

    一 解决方案 修改web.xml配置文件 将下面配置拷贝进去(在原有的web-app节点里面配置 其它配置不变) <!-- 处理PUT提交参数(只对基础表单生效) --> <filt ...

  3. JUC——线程同步锁(Condition精准控制)

    在进行锁处理的时候还有一个接口:Condition,这个接口可以由用户来自己进行锁的对象创建. Condition的作用是对锁进行更精确的控制. Condition的await()方法相当于Objec ...

  4. 关于matlab向文件写入数据的方法——留着备用

    MATLAB数据采集的时候,往往需要把得到的数据保存下来. fid = fopen(文件名,‘打开方式’): 说明:fid用于存储文件句柄值,如果fid>0,这说明文件打开成功.打开方式有如下选 ...

  5. 刨根问底KVO原理

    介绍 KVO( NSKeyValueObserving )是一种监测对象属性值变化的观察者模式机制.其特点是无需事先修改被观察者代码,利用 runtime 实现运行中修改某一实例达到目的,保证了未侵入 ...

  6. Datasets

    STL-10 https://cs.stanford.edu/~acoates/stl10/ CIFAR-10 and CIFAR-100 https://www.cs.toronto.edu/~kr ...

  7. golang slice使用不慎导致的问题

    原文链接 : http://www.bugclosed.com/post/16 背景 go语言中切片slice是方便且好用的强大数据结构,但是使用的时候需要注意,不然容易出问题,最近因为遇到了一个sl ...

  8. SSZipArchive解压失败的原因

    SSZipArchive 解压失败的原因是路径不对解压失败后,修正路径后再次解压就会出现解压失败的情况,代理方法也不会走也没有日志输出.解决方法就是删除手机上的软件再次运行就可以了.这个问题也就在内部 ...

  9. 常用函数-filter、map、reduce、sorted

    常用函数 filter map reduce sorted和列表自带sort 待续... 一.filter函数 1.说明 filter()函数接收一个函数 f 和一个可迭代对象,这个函数 f 的作用是 ...

  10. decode 函数及其用法

    http://blog.csdn.net/oscar999/article/details/18399177