java什么反射?

互联网 19-11-18

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。

实现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什么反射?的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: 反射
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:java能写什么?

相关资讯