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

反射在集合中的应用

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

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

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 array = new ArrayList();
		
		// (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("足球运动员喜欢打飞机");
	}
}


配置的文件

【我的Java笔记】Java反射_反射的应用_第1张图片


结果:











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

例:写一个方法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;
	}
}

【我的Java笔记】Java反射_反射的应用_第2张图片







你可能感兴趣的:(JavaSE)