JavaSE之反射
Posted 梧桐更兼细雨_到黄昏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaSE之反射相关的知识,希望对你有一定的参考价值。
反射
概述:反射是框架设计的灵魂
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之反射的主要内容,如果未能解决你的问题,请参考以下文章