反射是java的特征之一,是一种间接操作目标对象的机制。
java反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
java中为什么需要反射?反射要解决什么问题?
一句话概括就是使用反射可以赋予jvm动态编译的能力,否则类的元数据信息只能用静态编译的方式实现,例如热加载,tomcat的classloader等等都没法支持
java中编译类型有两种:
● 静态编译:在编译时确定类型,绑定对象即通过。
● 动态编译:运行时确定类型,绑定对象。动态编译最大限度地发挥了java的灵活性,体现了多态的应用,可以减低类之间的耦合性。
java反射是java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过reflection apis取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public、static等)、superclass(例如object)、实现之interfaces(例如cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。
reflection可以在运行时加载、探知、使用编译期间完全未知的classes。即java程序可以加载一个运行时才得知名称的class,获取其完整构造,并生成其对象实体、或对其fields设值、或唤起其methods。
反射(reflection)允许静态语言在运行时(runtime)检查、修改程序的结构与行为。
在静态语言中,使用一个变量时,必须知道它的类型。在java中,变量的类型信息在编译时都保存到了class文件中,这样在运行时才能保证准确无误;换句话说,程序在运行时的行为都是固定的。如果想在运行时改变,就需要反射这东西了。
实现java反射机制的类都位于java.lang.reflect包中:
1、class类:代表一个类
2、field类:代表类的成员变量(类的属性)
3、method类:代表类的方法
4、constructor类:代表类的构造方法
5、array类:提供了动态创建数组,以及访问数组的元素的静态方法
使用
1、获取class对象的三种方式
1.1 object ——> getclass();
1.2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
1.3 通过class类的静态方法:forname(string classname)(常用)
/** * 获取class对象的三种方式 * 1 object ——> getclass(); * 2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性 * 3 通过class类的静态方法:forname(string classname)(常用) * */public class fanshe { public static void main(string[] args) { //第一种方式获取class对象 student stu1 = new student();//这一new 产生一个student对象,一个class对象。 class stuclass = stu1.getclass();//获取class对象 system.out.println(stuclass.getname()); //第二种方式获取class对象 class stuclass2 = student.class; system.out.println(stuclass == stuclass2);//判断第一种方式获取的class对象和第二种方式获取的是否是同一个 //第三种方式获取class对象 try { class stuclass3 = class.forname("fanshe.student");//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名 system.out.println(stuclass3 == stuclass2);//判断三种方式是否获取的是同一个class对象 } catch (classnotfoundexception e) { e.printstacktrace(); } system.out.println("*****************获取公有、无参的构造方法*************"); constructor con = clazz.getconstructor(null); //1>、因为是无参的构造方法所以类型是一个null,不写也可以:这里需要的是一个参数的类型,切记是类型 //2>、返回的是描述这个无参构造函数的类对象。 system.out.println("*************获取公有字段**并调用*****************"); field f = stuclass.getfield("name"); system.out.println(f); system.out.println("***************获取私有的show4()方法******************"); m = stuclass.getdeclaredmethod("show4", int.class); system.out.println(m); m.setaccessible(true);//解除私有限定 object result = m.invoke(obj, 20);//需要两个参数,一个是要调用的对象(获取有反射),一个是实参 system.out.println("返回值:" + result); }}
以上就是java什么反射?的详细内容。
