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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏阮一峰的网络日志

JavaScript 有多灵活?

JavaScript 是一种灵活的语言,表达力极强,我来举一个例子,保证让很多人大吃一惊。 本文受到了 Kyle Simpson 的文章《Iterating E...

3247
来自专栏coding for love

JS原生引用类型解析7-Promise类型

ES6引入了一个全新的对象Promise,用于表示一个异步操作的最终状态(完成或失败),以及其返回的值。Promise最直接的好处就是链式调用,另外在错误捕获上...

481
来自专栏编程心路

学过框架的必看—Java反射

反射作为 Java 的高级特性,很多框架中都用到了反射的知识,如 Spring,Hibernate等,通过配置就可以动态干预程序的运行,那么什么是反射呢?

795
来自专栏AzMark

Python 学习之正则表达式「下」

re.sub(pattern, repl, string, count, flags=0) 与 re.subn(…) repl 用来替换的字符串,strin...

541
来自专栏HTML5学堂

JavaScript基础讲解 - 函数与参数

HTML5学堂 :函数与参数,虽然是基础知识,但是基础不扎实,就更不必谈什么“高级开发”了,毕竟复杂的功能是由多个简单功能堆积而成的。函数中的参数知识,需要注意...

2796
来自专栏梧雨北辰的开发录

Swift学习:构造器(下)

本篇主要介绍Swift中构造器的一些特殊用法 一、可失败的构造器 顾名思义,这是用于我们构造过程可能失败情况的构造器。失败的原因可能是给构造器传入无效的参数值,...

2467
来自专栏极客编程

ECMAScript 6教程 (二) 对象和函数

上面代码的方法一是直接用标识符作为属性名,方法二是用表达式作为属性名,这时要将表达式放在方括号之内。

884
来自专栏DannyHoo的专栏

Block

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

942
来自专栏Java帮帮-微信公众号-技术文章全总结

27.反射,类加载器,设计模式,jdk新特性

1:反射(理解) (1)类的加载及类加载器 类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行...

2673
来自专栏ccylovehs

JavaScript之深拷贝和浅拷贝

工作中会经常遇到操作数组、对象的情况,你肯定会将原数组、对象进行‘备份’ 当真正对其操作时发现备份的也发生改变,此时你一脸懵逼,到时是为啥,不是已经备份了么,怎...

721

扫码关注云+社区