我是一个计算机专业研0的学生卡蒙Camel🐫🐫🐫(刚保研)
记录每天学习过程(主要学习Java、python、人工智能),总结知识点(内容来自:自我总结+网上借鉴)
希望大家能一起发现问题和补充,也欢迎讨论👏👏👏
文章目录
反射
通过反射你可以在运行时获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。反射机制一般用来解决Java 程序运行期间,对某个实例对象一无所知的情况下,如何调用该对象内部的方法问题。
反射原理
Java反射底层是基于JVM实现的。JVM
加载完一个类后,在堆内存中就会产生该类的一个 Class
对象,一个类在堆内存中最多只会有一个 Class
对象,这个Class
对象包含了该类的完整结构信息,我们通过这个 Class
对象便可以得到该类的完整结构信息。
Class类
Class类是一个特殊的类,它用于表示JVM运行时的类或接口的信息。你可以把它看作是一个普通的类,但它描述的是所有的类的公共特性。Class类是一个反射工具,能提供很多方法用于获取类的各种信息,比如获取类名、判断该类是否是一个接口还是普通类等等。
基本使用
1. 获取类对象
- 使用类的
class
属性
class Person {
private String name;
private int age;
// 构造方法、getter和setter方法等省略
}
public class Main {
public static void main(String[] args) {
Class<?> personClass = Person.class;
}
}
- 使用对象的
getClass()
方法
Person person = new Person();
Class<?> personClass = person.getClass();
- 使用
Class.forName()
方法
可以通过类的全限定名(包括包名)来获取类对象
try {
Class<?> personClass = Class.forName("com.example.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
2. 获取类的构造函数、方法、字段
- 获取构造函数
通过Class实例获取Constructor的方法如下:
-
getConstructor(Class...)
:获取某个public
的Constructor
; -
getDeclaredConstructor(Class...)
:获取某个Constructor
; -
getConstructors()
:获取所有public
的Constructor
; -
getDeclaredConstructors()
:获取所有Constructor
。 -
获取方法
-
Method getMethod(name, Class...)
:获取某个public
的Method
(包括父类) -
Method getDeclaredMethod(name, Class...)
:获取当前类的某个Method
(不包括父类) -
Method[] getMethods()
:获取所有public
的Method
(包括父类) -
Method[] getDeclaredMethods()
:获取当前类的所有Method
(不包括父类)
public class Main {
public static void main(String[] args) throws Exception {
Class stdClass = Student.class;
// 获取public方法getScore,参数为String:
System.out.println(stdClass.getMethod("getScore", String.class));
// 获取继承的public方法getName,无参数:
System.out.println(stdClass.getMethod("getName"));
// 获取private方法getGrade,参数为int:
System.out.println(stdClass.getDeclaredMethod("getGrade"