From 实验楼第10期java楼赛 - 模拟IOC的题目。
需求
补全类 ShiyanlouImpl,实现 toUp(String name) 方法, toUp 方法将传入的字符串转为大写并返回 (异常情况返回 null),例如传入的为 shiyanlou,返回的为 SHIYANLOU。
补全 Main 类的 ioc(String className, Shiyanlou s, String methodName, String name) 方法,实现功能:
1.反射生成 className 类实例;
2.找到 className 实例中类型为 Shiyanlou 的变量并调用 set 方法注入参数 s;
3.然后调用 className 的 methodName 方法传入 name 参数;
提示
注意处理异常情况;
注意要使用set方法注入;
Shiyanlou.java
public interface Shiyanlou {
public String toUp(String name);
}
ShiyanlouImpl.java
toUp函数这块需要注意try-catch,否则报错
public class ShiyanlouImpl implements Shiyanlou{
@Override
public String toUp(String s) {
try {
return s.toUpperCase();
} catch (Exception e) {
// TODO Auto-generated catch block
return null;
}
}
}
Main.java
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Main {
// TODO
public static void ioc(String className,Shiyanlou s,String methodName, String name){
try {
//通过包名+类名获得类实例
Class<?> myClass = Class.forName(className);
//getDeclaredFields方法获得类中所有声明的字段(域)
Field [] fields = myClass.getDeclaredFields();
//获得对象实例
Object obj = myClass.newInstance();
for (int i = 0; i < fields.length; ++i) {
//遍历找到类型为Shiyanlou的字段,
if (Shiyanlou.class.isAssignableFrom(fields[i].getType())) {
//构造形如"setShiyanlou"的方法名
String setName = "set" + fields[i].getName().substring(0, 1).toUpperCase() +
fields[i].getName().substring(1);
//调用set方法注入
Method method1 = myClass.getMethod(setName, Shiyanlou.class);
method1.invoke(obj, s);
}
}
Method method2 = myClass.getMethod(methodName, String.class);
method2.invoke(obj, name);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
小比较:
Class1.isAssignableFrom(Class2)返回值:
true:两个类相同,或者class1是class2的父类或实现的接口
class1 instanceof Class1返回值:
true:class1是Class1的一个实例或者是其子类的实例