JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
反射的好处就在于动态获取对象和对象里面的方法,现在我们先写一个小例子:
运行之后我们会获得一个输出:
当我们new出一个Student对象之后,java自动调用他的无参构造函数,所以有第一行的输出,如果我们想调用其他的有参数的构造方法,我们应该怎么写?
因此我们也调用了Student内有参数的构造方法。
还有这里要说明一下Class这个类,这个类是java里面所有类的基类,所有的类都是继承他的。我们现在通过包名获取这个对象
我们现在在控制台可以看到输出,都为true。因为我们是对同一个对象进行new,所有得到的都是true。
如果我们想反射出类里面的方法,我们应该怎么写?
从控制台可以看到,我们有一个报错,我是因为要测试,让读者看到反射的原理。通过调用Class里面的getMethod方法获取对象里面的方法名称,如果没有此方法,就会报异常,NoSuchMethodException,而后面的输出都会看到吧类里面的方法全部输出。无论是共有的还是私有的,均会被输出,调用方法可以参考JAVAAPI文档。