现在有一个项目,项目中创建了一个Person类,在Person类中定义了一个sleep()方法。在工程中还定义了一个Student类继承Person类,在Student类中重写了Person类的sleep()方法。项目有一个配置文件,名称为test.properties,在配置文件中配置了一个className属性和一个methodName属性,className属性值是类的全限定类名,methodName属性值是方法名。 本案例要求通过读取配置文件对类进行实例化,具体如下: (1)获取test.prop
时间: 2024-03-03 11:53:07 浏览: 68
Java面向对象(高级)- 抽象类与抽象方法(或abstract关键字)
erties文件中的className和methodName属性值。
(2)通过反射机制,根据className属性值实例化出一个对象。
(3)通过反射机制,根据methodName属性值调用对象的方法。
具体代码实现如下:
```
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;
public class Main {
public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
// 加载配置文件
Properties props = new Properties();
InputStream in = new FileInputStream("test.properties");
props.load(in);
// 获取className和methodName
String className = props.getProperty("className");
String methodName = props.getProperty("methodName");
// 通过反射机制实例化对象
Class clazz = Class.forName(className);
Object obj = clazz.newInstance();
// 通过反射机制调用方法
Method method = clazz.getMethod(methodName);
method.invoke(obj);
}
}
class Person {
public void sleep() {
System.out.println("Person sleep");
}
}
class Student extends Person {
@Override
public void sleep() {
System.out.println("Student sleep");
}
}
```
在上述代码中,我们首先使用Properties类加载配置文件,然后通过getProperty方法获取className和methodName属性值。接着,通过Class.forName方法获取类的Class对象,通过Class.newInstance方法实例化对象,通过Class.getMethod方法获取方法的Method对象,最后通过Method.invoke方法调用方法。在这个例子中,如果test.properties文件中配置的是Person类和sleep方法,那么输出结果就是Person sleep;如果配置的是Student类和sleep方法,那么输出结果就是Student sleep。
阅读全文