【我的Java笔记】Java反射_反射的应用

本文介绍了反射技术在不同场景的应用案例,包括使用反射给ArrayList添加不同类型的数据、从配置文件加载类并调用其方法以及动态设置对象属性等。这些示例展示了反射在实际编程中的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反射在集合中的应用

例:一个ArrayList<Integer>集合对象,需要给集合里添加String类型数据

/*
 * 一个ArrayList<Integer>集合对象,给此集合里添加字符串数据
 * */

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;

public class ArrayListDemo {

	public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		
		ArrayList<Integer> array = new ArrayList<Integer>();
		
		// (1)获取ArrayList类的字节码文件对象
		Class c = array.getClass();
		
		// (2)通过反射获取ArrayList集合的方法add()
		Method method = c.getMethod("add", Object.class);
		
		// (3)调用invoke() 方法给集合中添加数据
		method.invoke(array, "hello");
		method.invoke(array, "world");
		method.invoke(array, "java");
		
		System.out.println(array);
	}
}







反射在配置文件中的应用

使用反射调用类中的方法,将文本文件中的内容加载到属性集合类中(文本文件是键值对的形式)

该方法的优点:只用改动文本文件“class.txt”中的类名即可调用方法


例:

/*
 * 反射在配置文件中的应用:使用反射调用类中的方法
 * 将文本文件中的内容加载到属性集合类中(文本文件是键值对的形式)
 * 优点:只用改动文本文件“class.txt”中的类名即可调用方法
 * */

import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Properties;

// 测试类
public class PeiZhiWenJianTest {

	public static void main(String[] args) throws Exception {

		// 创建一个属性集合类
		Properties prop = new Properties();
		// 加载
		FileReader fr = new FileReader("class.txt");
		prop.load(fr);
		// 释放资源
		fr.close();

		// 通过键获取值,使用getProperty("String key") 方法
		String className = prop.getProperty("className");
		String methodName = prop.getProperty("methodName");

		// 获取字节码文件对象
		Class c = Class.forName(className);

		// 通过反射获取构造器对象,并且通过构造器对象创建该类的实例
		Constructor con = c.getConstructor();
		Object obj = con.newInstance();

		// 获取成员方法
		Method m = c.getMethod(methodName);

		// 调用
		m.invoke(obj);
	}
}


public class Student {
	public void love() {
		System.out.println("学生喜欢踢足球");
	}
}


public class Teacher {
	public void love() {
		System.out.println("老师喜欢唱套马杆");
	}
}


public class FootballPlayer {
	public void love() {
		System.out.println("足球运动员喜欢打飞机");
	}
}


配置的文件



结果:











通过反射给固定的一个类的属性设置属性值

例:写一个方法public void setProperty(Object obj, String propertyName, Object value),此方法可将obj对象中名为propertyName的属性的值设置为value


/*
 * 通过反射给固定的一个类的属性设置属性值:
 * 写一个方法public void setProperty(Object obj, String propertyName, Object value)
 * 此方法可将obj对象中名为propertyName的属性的值设置为value
 * */

import java.lang.reflect.Field;

// 测试类
public class ToolDemo {

	public static void main(String[] args)
			throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {

		// 创建Person类对象
		Person p = new Person();
		Tool t = new Tool();
		// 设置name属性
		t.setProperty(p, "name", "伊卡尔迪");
		t.setProperty(p, "age", 24);

		System.out.println(p);

		Dog d = new Dog();
		t.setProperty(d, "gender", '公');
		t.setProperty(d, "price", 34.56F);
		System.out.println(d);
	}
}

// 工具类:提供public void setProperty(Object obj, String propertyName, Object
// value)方法
class Tool {
	public void setProperty(Object obj, String propertyName, Object value)
			throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {

		// 获取类的字节码文件对象
		Class c = obj.getClass();

		// 通过字节码文件对象获取Field对象
		// 为了防止可能后有一些私有的成员变量:getDeclaredField("字段名称")
		Field field = c.getDeclaredField(propertyName);

		// 通过field对象给指定对象obj设置属性值
		// 防止出现 IllegalAccessException:设置Java语言取消访问检查
		field.setAccessible(true);
		field.set(obj, value);
	}
}

class Person {
	private String name;
	public int age;

	@Override
	public String toString() {
		return name + "---" + age;
	}
}

class Dog {
	char gender;
	float price;

	@Override
	public String toString() {
		return gender + "---" + price;
	}
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值