一、Java反射的定义
首先大家应该先了解两个概念,编译期和运行期,编译期就是编译器帮你把源代码翻译成机器能识别的代码,比如编译器把java代码编译成jvm识别的字节码文件,而运行期指的是将可执行文件交给操作系统去执行,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
简单说,反射机制值得是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。反射的实现其实是在运行的时候,此时类加载器已经将class文件加载到jvm虚拟机里面去了;

二、java反射机制提供了什么功能?

在运行时能够判断任意一个对象所属的类

在运行时构造任意一个类的对象

在运行时判断任意一个类所具有的成员变量和方法

在运行时调用任一对象的方法

在运行时创建新类对象

三、java反射的实现方式
(1)通过.class

// 第一种 获取到类对象
Class class1 = Person.class;

(2)通过创建实例对象来获取类对象

 Person person =new Person();
 Class class2 = person.getClass();

(3) 通过包名,调用class的forName方法

   Class class3 =  Class.forName("day07.Person");

其中第3种方式是用的最多,只知道包名类名,其他啥也拿不到那种;个人认为这才是反射存在的意义。

四、new和反射创建有什么区别呢?

new: 静态编译,在编译期就将模块编译进来,执行该字节码文件,所有的模块都被加载;

反射:动态编译,编译期没有加载,等到模块被调用时才加载;

注:spring的ioc就用到反射机制,newInstance创建。更加的通用,并且降低耦合,避免了硬编码,只需提供一个字符串就可以动态的创建。

String className = readfromXMlConfig;//从xml 配置文件中获得字符串
Class c = Class.forName(className);
factory = (AInterface)c.newInstance();

举例:
有自行车🚲,小轿车🚗,
静态:上班将自行车放车里去上班,一定得带着,一个不能落下,
动态:将自行车放家里,交通堵塞骑自行车去,车放家里。

JAVA反射机制的优点:
1.增加程序的灵活性,避免将程序写死到代码里。
2.代码简洁,提高代码的复用率,外部调用方便
3.对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法

JAVA反射机制的缺点:
性能问题

1.使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此Java反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。

2.反射包括了一些动态类型,所以JVM无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。我们应该避免在经常被执行的代码或对性能要求很高的程序中使用反射。

使用反射会模糊程序内部逻辑

程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂。

安全限制

使用反射技术要求程序必须在一个没有安全限制的环境中运行。如果一个程序必须在有安全限制的环境中运行,如Applet,那么这就是个问题了

内部暴露

由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使用反射可能会导致意料之外的副作用--代码有功能上的错误,降低可移植性。反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化。