反射案列
程序员文章站
2022-06-09 12:57:32
...
反射案列
编写一个简单的框架,可以帮助我们创建任意类的对象,并且可以执行任意的方法。
要求:不改变框架类,实现上述功能
实现思路:
- 使用配置文件
- 使用反射
实现步骤:
- 在配置文件中,配置需要创建的类的全类名和需要执行的方法
- 在程序中读取配置文件。
- 使用反射技术加载配置的类的文件到内存
- 创建全类名对应的对象
- 执行配置的方法
实体类对象
package com.cj.entity;
public class Student {
private String name;
private int age;
public String context;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
}
public Student() {
}
public Student(String name, int age, String context) {
this.name = name;
this.age = age;
this.context = context;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", context='" + context + '\'' +
'}';
}
}
配置文件(myframe.properties)
fullClassName=com.cj.entity.Student
methodName=setContext
methodType=java.lang.String
methodValue=18
main
package com.cj.myframe;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
public class Frame {
public static void main(String[] args) {
Properties properties=new Properties();
InputStream is=Frame.class.getClassLoader().getResourceAsStream("myframe.properties");
//加载配置文件,并将配置文件信息封装到properties对象中
try {
properties.load(is);
String fullClassName = properties.getProperty("fullClassName");
String methodName = properties.getProperty("methodName");
String methodType = properties.getProperty("methodType");
System.out.println(methodType);
String[] strings = methodType.split(",");
Class[] classes = new Class[strings.length];
for (int i = 0; i < strings.length; i++) {
classes[i] = Class.forName(strings[i]);
}
String methodValue = properties.getProperty("methodValue");
System.out.println(methodValue);
//创建类对象
Class<?> aClass = Class.forName(fullClassName);
Object o = aClass.newInstance();
Method declaredMethod = aClass.getDeclaredMethod(methodName, classes);
declaredMethod.setAccessible(true);
declaredMethod.invoke(o, "18");
} catch (Exception e) {
e.printStackTrace();
}
}
}
下一篇: 双数据源结合线程池使用案例