模拟IOC

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的一个实例或者是其子类的实例

你可能感兴趣的:(Java)