好,今天讲一讲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中的方法了。

        好了,下次我们更深入的探讨反射的应用场景,方便大家快速理解。今天先聊到这里,再会。

        

        

 

 

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐