码迷,mamicode.com
首页 > 编程语言 > 详细

JavaSE之反射

时间:2020-07-05 13:30:55      阅读:52      评论:0      收藏:0      [点我收藏+]

标签:sina   功能   获取   属性   指定   lan   tps   种类型   lock   

反射

概述:反射是框架设计的灵魂

java反射机制是在运行状态中,对任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java的反射机制。
利用反射技术可以将一个类中各个组成部分映射成一个个对象。
反射的原理在于class对象,Class对象是将class文件读入内存,并为之创建一个Class对象。

使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)

虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。
基本的Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字void 也都对应一个Class对象。 
每个数组属于被映射为Class对象的一个类,所有具有相同元素类型和维数的数组都共享该Class对象。
一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。

获取class对象的三种方式

1.Object的getClass()方法;
2.任何数据类型(包括基本数据类型)都有一个“静态”的class属性;Student.class
3.通过Class类的静态方法:forName(String  className)(常用);注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
package fanshe;
/**
 * 获取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();
		}
		
	}
}

调用方法

1、获取构造方法:
	(1)批量获取:
		public Constructor[] getConstructors():所有"公有的"构造方法
		public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)
	(2)单个获取
		public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法
		public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有
	(3)调用构造方法
		Constructor-->newInstance(Object... initargs)
		此处newInstance是Constructor类的方法,使用newInstance构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
		返回值类型是T类型,所以newInstance是创建了一个构造方法的声明类的新实例对象,并为之调用。

2、获取成员变量:
	1.批量的
	(1)Field[] getFields():获取所有的"公有字段"
	(2)Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;
	2.获取单个的:
	(1)public Field getField(String fieldName):获取某个"公有的"字段;
	(2)public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)
设置字段的值:
	Field --> public void set(Object obj,Object value):
参数说明:
	1.obj:要设置的字段所在的对象;
	2.value:要为字段设置的值;
	3.获取成员方法:

1.批量:
	(1)public Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)
	(2)public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)
2.单个:
	(1)public Method getMethod(String name,Class<?>... parameterTypes);	name:方法名	class...:形参的class类型对象
	(2)public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
注意:Method--> public Object invoke(Object obj,Object... args):
参数:obj:要调用方法的对象		args:调用方法时所传递的实参

4.反射main方法
	部分内容查看原文

原文链接:https://blog.csdn.net/sinat_38259539/article/details/71799078

JavaSE之反射

标签:sina   功能   获取   属性   指定   lan   tps   种类型   lock   

原文地址:https://www.cnblogs.com/njuptzheng/p/13245764.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!