java反射机制

1.反射的定义

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

java反射机制主要提供了以下功能

  • 在运行时判断任意一个对象所属的类;
  • 在运行时构造任意一个类的对象;
  • 在运行时判断任意一个类所具有的成员变量和方法;
  • 在运行时调用任意一个对象的方法;生成动态代理

2.反射的优缺点

为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念。程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言,相对的就是静态语言。

优点

增加程序的灵活性,避免将程序写死到代码里。反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中 灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把设计的很完美,当这个程序编 译后,发布了,当发现需要更新某些功能时,不可能要用户把以前的卸载,再重新安装新的版本。

缺点

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

3.反射的相关操作

Java反射所需要的类并不多,主要有java.lang.Class类和java.lang.reflect包中的Field、Constructor、Method、Array类。

注意:Class类是Java反射的起源,针对任何一个你想探勘的类,只有先为它产生一个Class类的对象,接下来才能通过Class对象获取其他想要的信息。

那么反射能够用来做什么呢?

  • 获取成员方法Method
  • 获取成员变量Field
  • 获取构造函数Constructor

3.1获取成员方法Method

api

// 得到该类所有的方法,不包括父类的
public Method getDeclaredMethod(String name, Class<?>... parameterTypes);

// 得到该类所有的public方法,包括父类的
public Method getMethod(String name, Class<?>... parameterTypes); 

示例

//输出类的public方法        
Method[] methods = exampleObjectClass.getMethods();        
for (Method method : methods){            
    System.out.println("method = "+ method.getName());        
}

3.2获取成员变量Field

api

// 获得该类自身声明的所有变量,不包括其父类的变量
public Field getDeclaredField(String name);
 
// 获得该类自所有的public成员变量,包括其父类变量
public Field getField(String name);

示例

Field field = exampleObjectClass.getField("age");        
System.out.println("变量为:" + field.toString());

3.3获取构造函数Constructor

api

// 获得该类所有的构造器,不包括其父类的构造器 
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes);

// 获得该类所以public构造器,包括父类
public Constructor<T> getConstructor(Class<?>... parameterTypes);

示例

Constructor constructor = exampleObjectClass.getConstructor(String.class);   
System.out.println(constructor.toString());

到此,反射机制的基本知识就差不多了,后续学习springmvc时,spring的控制反转和依赖注入就是用反射机制实现的。

最后,如果你有仍何开发上面的问题都可以和我交流沟通。

原文发布于微信公众号 - java工会(javagonghui)

原文发表时间:2018-04-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

3 条评论
登录 后参与评论

相关文章

来自专栏偏前端工程师的驿站

JS魔法堂:函数重载 之 获取变量的数据类型

Brief                                 有时我们需要根据入参的数据类型来决定调用哪个函数实现,就是说所谓的函数重载(func...

1858
来自专栏博客园

.NET面试题解析(02)-拆箱与装箱

装箱和拆箱几乎是所有面试题中必考之一,看上去简单,就往往容易被忽视。其实它一点都不简单的,一个简单的问题也可以从多个层次来解读。

1054
来自专栏xingoo, 一个梦想做发明家的程序员

Ruby编程实践

命令 常量大写 类名和模块名首字母大写,驼峰法,MyClass,Person 方法名小写,ruby中末尾添加符号特殊含义:destroyMethod!表示这个方...

1909
来自专栏绿巨人专栏

[Java] 设计模式: Code Shape - 管理你的代码结构

3696
来自专栏xiaoheike

hibernate persist update 方法没有正常工作(不保存数据,不更新数据)

在工程中通过spring aop的方式配置事务,使用hibernate做持久化。在代码实现中使用hibernate persit()方法插入数据到数据库,使用h...

691
来自专栏郭耀华‘s Blog

Java集合框架(五)—— Map、HashMap、Hashtable、Properties、SortedMap、TreeMap、WeakHashMap、IdentityHashMap、EnumMap

Map Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另一组值用于保存Map里的value,key和v...

2737
来自专栏程序猿DD

漫画:什么是单例模式?(整合版)

————— 第二天 ————— 单例模式第一版: public class Singleton { private Singleton() {} ...

19610
来自专栏DOTNET

C#要点

内容摘要 1 数据类型   1.1表达范围问题   1.2 数组的长度问题   1.3 值类型与引用类型   1.4 匿名类型与隐式类型   1.5硬编码造成的...

2785
来自专栏菩提树下的杨过

Linq排序效率 Vs 快速排序效率

 1 using System;  2 using System.Collections;  3 using System.Collections.Generi...

1848
来自专栏用户2442861的专栏

Java反射探索-----从类加载说起

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

381

扫码关注云+社区