一个结合反射与注解的java题目

已知一个包下分别有TigerLionElephant 三个Java源文件,请据此实现以下功能:

①、自定义一个名为Component的注解,要求该注解只能用于类且代码运行时该注解依然有效;

②、为TigerLion类添加Component注解

③、在Application类中定义静态代码块,该代码块可自动将有Component注解修饰的类创建对象并放在Map集合中;然后定义一个名为getBeanstatic方法,要求传入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);
	}
}

代码不长,但比较考验基础性知识。

猜你喜欢

转载自blog.csdn.net/LanQiLi/article/details/81262404