package reflect;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;
//定义注解
/**
* @Target 注解用于描述你定义的注解(能够修饰哪些元素)
* @Target(value={ElementType.TYPE}) 表示此注解只能描述类
* @Target(ElementType.TYPE) 简写形式
* @Target({ElementType.TYPE, ElementType.METHOD}) 表示此注解既能描述类,又能描述方法
* @Target(ElementType.METHOD) 表示此注解只能描述方法
* @Retention(RetentionPolicy.RUNTIME) 让注解运行时有效
*/
@Target(value={ElementType.TYPE})//表示此注解只能描述类
@Retention(RetentionPolicy.RUNTIME)//让注解何时生效(让注解运行时有效)
@interface Component{
String value() default "";
}//Component.class
@Component//("cir")
class Circle{
public String toString() {
return "Circle []";
}
}
public class TestReflect {
public static void main(String[] args) throws Exception{
//1.获取Circle字节码对象
Class<?> c=Class.forName("reflect.Circle");
//2.判定类上有没有@Component注解
boolean flag=c.isAnnotationPresent(Component.class);
if(!flag)return;//spring 不管
//3.有@Component注解修饰则获取注解对象
Component cmt=c.getDeclaredAnnotation(Component.class);
//4.获取注解对象上的value属性的值.
String value=cmt.value();
Constructor<?> con= c.getDeclaredConstructor();
if("".equals(value)) {
String oldChar = String.valueOf(c.getSimpleName().charAt(0));
String newChar = oldChar.toLowerCase();
//调用replaceFirst方法,将第一次出现的C,替换为c
value = c.getSimpleName().replaceFirst(oldChar, newChar);
}
System.out.println(value);
if(!con.canAccess(null)){
con.setAccessible(true);
}
Object putObj=con.newInstance();
Map<String, Object> springBean = new HashMap<String, Object>();
springBean.put(value, putObj);
Object getObj = springBean.get(value);
System.out.println(getObj);
}
}
07-14
707
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
07-03
1万+
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
08-06
726
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)