反射实现Hello World(注解的使用)

注解中的元数据包括Target,Rentention,Inherited,Documented。

注解:

public interface Annotation

The common interface extended by all annotation types. Note that an interface that manually extends this one does not define an annotation type. Also note that this interface does not itself define an annotation type. More information about annotation types can be found in section 9.6 of The Java™ Language Specification.

Java注解教程及自定义注解

Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容。在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解。

Java1.5引入了注解,当前许多java框架中大量使用注解,如Hibernate、Jersey、Spring。注解作为程序的元数据嵌入到程序当中。注解可以被一些解析工具或者是编译工具进行解析。我们也可以声明注解在编译过程或执行时产生作用。

在使用注解之前,程序源数据只是通过java注释和javadoc,但是注解提供的功能要远远超过这些。注解不仅包含了元数据,它还可以作用于程序运行过程中、注解解释器可以通过注解决定程序的执行顺序。例如,在Jersey webservice 我们为方法添加URI字符串的形式的PATH注解,那么在程序运行过程中jerser解释程序将决定该方法去调用所给的URI。

Test.java

package test;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import test2.TestHello;

public class Test {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException 
    {

        StringBuffer sb = new StringBuffer();
        Class<?> clazz = Class.forName("test2.Hello");
        Object obj = clazz.newInstance();
        Boolean bool = clazz.isAnnotationPresent(TestHello.class);
        if (bool == true)
        {

            TestHello th = (TestHello)clazz.getAnnotation(TestHello.class);
            sb.append(th.value());
            Method[] me =clazz.getDeclaredMethods();
            for (Method mt:me)
            {
                if (mt.isAnnotationPresent(TestHello.class))
                {
                    TestHello tlo = (TestHello)mt.getAnnotation(TestHello.class);
                    sb.append(tlo.value());
                    System.out.println(sb.toString());
                    mt.invoke(obj);



                }else
                {

                    continue;
                }

            }
        }


    }

}

Hello.java

package test2;
@TestHello("/he")
public class Hello {

    @TestHello("/heFild")
    private String  str = "Hello world";
    @TestHello("/helloMethod")
    public void sayHello()
    {

        System.out.println("Hello world");
    }


}

TestHello.java(注解类)

package test2;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface TestHello {
    public  String value();

}

运行结果:
/he/helloMethod
Hello world

————————————————-分割线———

再说注解:同class和interface一样,注解也是一种类型。
注解的定义
注解通过@Interface进行定义

public  @interface HelloTest(){

}

它的形式跟接口很类似,不过前面多了一个 @ 符号。上面的代码就创建了一个名字为 HelloTest的注解。
你可以简单理解为创建了一张名字为 HelloTest的标签。

这周就此写一个类似Spring的简单框架。

猜你喜欢

转载自blog.csdn.net/helloworlddm/article/details/80013125