已知一个包下分别有Tiger、Lion、Elephant 三个Java源文件,请据此实现以下功能:
①、自定义一个名为Component的注解,要求该注解只能用于类且代码运行时该注解依然有效;
②、为Tiger和Lion类添加Component注解
③、在Application类中定义静态代码块,该代码块可自动将有Component注解修饰的类创建对象并放在Map集合中;然后定义一个名为getBean的static方法,要求传入Class类实例时返回该Class类对应类的对象,如果没有Class类对应类的对象,则引发NoSuchBeanDefinitionException异常并提示“No qualifying bean of type ' 包名.类名' available”;
package com.test.two;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Component {
}
package com.test.two;
public class Elephant {
public Elephant() {
}
}
package com.test.two;
@Component
public class Lion {
public Lion(String str) {
}
}
package com.test.two;
@Component
public class Tiger {
public Tiger() {
}
}
package com.test.two;
public class NoSuchBeanDefinitionException extends Exception{
public NoSuchBeanDefinitionException(String message) {
super(message);
}
}
package com.test.two;
import java.io.File;
import java.lang.annotation.Annotation;
import java.util.HashMap;
import java.util.Map;
public class Application {
static Map< Class,Object>mp = new HashMap<Class,Object>();
static {
String srcPath = ClassLoader.getSystemResource("").getPath()+"com\\test\\two";
//System.out.println(srcPath);
File srcFile = new File(srcPath);
//System.out.println(srcFile);
File [] files = srcFile.listFiles();//当前路径下含有的文件
for (File file : files) {
//2、依据文件名拼接类名——"包名"+类名
String className = file.getName();
//System.out.println(className);
className = "com.test.two."+className.substring(0, className.indexOf("."));
//System.out.println(className);
try {
Class clazz = Class.forName(className);
Annotation [] annotations = clazz.getAnnotations();
for (Annotation annotation : annotations) {
if(annotation instanceof Component) {
try {
Object object = clazz.newInstance();
mp.put(clazz, object);
} catch (InstantiationException | IllegalAccessException e) {
try {
throw new InstantiationException(clazz.getName()+"无法创建该对象");
} catch (InstantiationException e1) {
e1.printStackTrace();
}
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
public static Object getBean(Class clazz)throws NoSuchBeanDefinitionException {
Object obj = mp.get(clazz);
if(obj==null) {
throw new NoSuchBeanDefinitionException("No qualifying bean of type "+clazz.getName()+" available");
}
return obj;
}
public static void main(String[] args) throws NoSuchBeanDefinitionException {
Application.getBean(Elephant.class);
}
}
代码不长,但比较考验基础性知识。