JAVA反射(上)
好,今天讲一讲java中的反射。先来看看豆包对反射的理解:Java反射(Reflection) 是Java语言提供的一种核心机制,允许程序在运行时获取类的内部信息(如成员变量、方法、构造器等),并动态操作这些内部元素(如创建对象、调用方法、修改属性值),无需在编译期明确知道类的具体信息。
在一个类的运行周期中,分为硬盘阶段、类阶段和对象阶段三个阶段。反射就是在硬盘阶段对所有潜在的类拟定好一套方案,不用知道类的具体信息。
首先打开eclipse创建好名为“com.reflect”的包,在包下创建名为“ref”的类再创建好main方法,我们来看看三种阶段获取类对象的方法:
//1、在硬盘阶段获取类对象,括号里根类全名:包名加类名
Class class1 = Class.forName("com.reflect.ref");
//2、类阶段获取类对象
Class class2 = ref.class;
//3、对象阶段获取类对象
ref var = new ref();
Class class3 = var.getClass();
我们所熟知的可能是第三种创建方法,但今天我们着重介绍的是第一种创建方法。当我们在实际运行过程中运行第一种方法时,可能会报错,在main方法后追加一个throws...代码如下:
public static void main(String[] args) throws Exception {
为了方便我们进行实验,需要在这个包下创建一个新的类,类里放如我提前准备好的属性、方法、及构造方法(我个人将类名设为了sub如果想改类名记得把构造方法也改了):
// 属性
private String name;
private int age;
public String from;
// 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
System.out.println("执行getAge方法");
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getFrom() {
return from;
}
private void run() {
System.out.println("run方法");
}
// 构成方法
public sub() {
}
public sub(String name, int age) {
this.name = name;
this.age = age;
}
在ref文件中创建一个s对象方便我们后续看到对对象执行后的结果,再创建一个类对象:
//创建对象
sub s = new sub();
//创建类对象
Class c = Class.forName("com.reflect.sub");
一、属性(返回Field类型,需要import java.lang.reflect.Field;):
1.获取当前类里所有属性:getDeclaredFields(); (返回数组)
2.通过属性名获取属性:getDeclaredField(属性名);
3.获取所有公共类型属性:getFields();(返回数组)
4.获取公共类型中指定的属性:getField(属性名);
5.设置对象的属性:属性对象.set(对象名,属性值)
当属性被private修饰无法被调用时,可以使用:类对象名.setAccessible(true); 来进行暴力反射。
二、方法(返回Method类型,需要import java.lang.reflect.Method;):
1.获取类里所有方法:getDeclaredMethods();(返回数组)
2.通过方法名获取方法:getDeclaredMethod(方法名);
3.获取所有公共类型方法:getMethods();(返回数组)
4.获取公共类型中指定的方法:getMethod(方法名);
5.运行指定的方法:方法对象.invoke(对象名, 参数);
第一个为对象名,第二个为参数名,如果没有参数可以不用输入,允许暴力反射。
三、构造方法(返回Constructor类型,需要import java.lang.reflect.Constructor;):
1.获取类里所有构造方法:getDeclaredConstructors();(返回数组)
2.获取指定的无参构造方法:getDeclaredConstructor();
3.获取指定的带有参数的构造方法(举例:带有String和int类型的两个参数的构造方法):getDeclaredConstructor(String.class,int.class);
4.获取所有公共类型的构造方法:getConstructors();(返回数组)
5.获取公共类型中指定的一个方法(有参或无参):getConstructor();
6.执行无参构造方法:Object 新变量名 = 构造方法对象.newInstance(); 相当于Object obj = new ();
7.执行有参的构造方法:Object 新变量名 = 构造方法对象.newInstance(参数);
新变量只能调Object及其父类原有的和子类重写的方法,如果想要调用子类方法可以进行强制类型转换。如:sub newVar = (sub)构造方法对象.newInstance(构造方法所需参数); 。这样就可以调用sub中的方法了。
好了,下次我们更深入的探讨反射的应用场景,方便大家快速理解。今天先聊到这里,再会。
更多推荐



所有评论(0)