java什么反射?
反射是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什么反射?的细致内容,更多请关注ki4网别的相干文章!