-
上述思维导图的下载地址为:http://download.csdn.net/detail/emilyrr/8975487 - 注解的注解:
经过上面的学习,我们可以通过元注解来实现一个自定义的HelloWorld注解
第一步:定义一个HelloWorld注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)//定义了注解的作用位置:在方法上
@Inherited//允许子类继承父类中的注解
public @interface HelloWorld {
public String name()default "";
}
- 新建一个注解解析类,底层通过反射机制实现
public class ParseAnnotation {
public void parseMethod(Class clazz) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{
Object obj = clazz.newInstance();
Method[] methods=clazz.getDeclaredMethods();
for(Method m:methods){
HelloWorld hello=m.getAnnotation(HelloWorld.class);
String name="";
if(hello!=null){
name=hello.name();
m.invoke(obj, name);
}
}
}
}
- 新建一个普通类,调用HelloWorld注解
public class SayHello {
@HelloWorld(name="Yc")
public void say(String name){
if(name == null || name.equals("")){
System.out.println("hello world");
}else{
System.out.println( "hello world\t"+name);
}
}
}
- 使用Junit测试(新建一个class,在main方法中测试也可以)
public void testApp() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException
{
ParseAnnotation pa=new ParseAnnotation();
pa.parseMethod(SayHello.class);
}
- 下面我们来看测试结果:
通过测试类可以看出,我们并没有直接new SayHello对象,也没有调用它的 say( )方法,而是通过注解的解析框架用反射机制激活的say。影哥说,这个编码的变革时代。