Java反射一

有人说希斯莱杰演出了最棒的小丑,也有人说杰昆菲尼克斯的小丑演的最入神,实际上我们都知道,是你,我的朋友,当你出场的时候我们都被你戏剧性的表演逗笑了,你才是当之无愧的小丑。

Java反射

什么是Java反射

  反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并
且对内部的成员进行操作。反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法
,对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象方法的功能称为
java语言的反射机制。

  那么通过这样的说法直接来获取一个概念非常抽象,但是我们假如存在这样一个场景,存在着这样一个Person类,存在两个属性,一个public属性和一个private属性,并且已经定义了参数,我们需要在代码运行的过程中去修改这两个属性的参数,就可以通过反射的方法直接进行调用。

  这里同时也提到在不同类中调用私有属性的一些方式:

  1.在含私有属性的类中创建公有方法进行操作。

  2.通过反射进行操作。

1
2
3
4
5
6
7
8
9
10
public class Person {
public String name = "小明";
private int age = 28;
public String getName(){
return name;
}
public int getAge(){
return age;
}
}

  直接通过实例化对象的方式。直接创建对象打印结果,且这种方法无法直接对私有属性进行调用,而反射则可以解决这一问题。

1
2
3
4
5
6
7
public class Main {
public static void main(String[] args){
Person person = new Person();
System.out.println(person.getName());
System.out.println(person.getAge());
}
}

直接调用

  这里体现了反射的用处,我们可以在没有setter方法的情况下对一个类中的属性进行操作,当然,反射也可以对类中的其他方法进行操作、解决一些类无法进行序列化反序列化等问题,这个在之后碰到了会进行实际补充。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.lang.reflect.Field;

public class Main {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Person person = new Person();
System.out.println(person.getName());
System.out.println(person.getAge());

System.out.println("************反射***************");
Class p = Person.class;//反射创建一个类
//获取公有属性
Field namefield = p.getField("name");
namefield.set(person, "小红");
//获取私有属性
Field agefiled = p.getDeclaredField("age");
agefiled.setAccessible(true);//激活私有属性
agefiled.set(person, 30);

System.out.println(person.getName());
System.out.println(person.getAge());
}
}

反射调用

反射中的一些常见操作

1
2
3
4
5
6
7
8
9
10
11
12
13
Class<?> clazz = SomeClass.class;
// 获取类名
String className = clazz.getName();
// 获取父类
Class<?> superClass = clazz.getSuperclass();
// 获取实现的接口
Class<?>[] interfaces = clazz.getInterfaces();
// 获取构造函数
Constructor<?>[] constructors = clazz.getConstructors();
// 获取方法
Method[] methods = clazz.getMethods();
// 获取字段
Field[] fields = clazz.getFields();

Java反射一
https://fliggyaa.github.io/2023/10/18/2023-10-18-java反射/
作者
fliggy
发布于
2023年10月18日
许可协议