例:一个ArrayList
/*
* 一个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("足球运动员喜欢打飞机");
}
}
配置的文件
结果:
例:写一个方法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;
}
}