模拟IOC

xiaoxiao2021-02-28  111

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

转载请注明原文地址: https://www.6miu.com/read-61362.html

最新回复(0)