首页 > 其他分享 >反射实现Hello World(注解的使用)

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

时间:2023-04-25 10:06:11浏览次数:42  
标签:java import Hello public TestHello 注解 World annotation


注解中的元数据包括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的简单框架。


标签:java,import,Hello,public,TestHello,注解,World,annotation
From: https://blog.51cto.com/u_16087831/6223422

相关文章

  • 1 Go语言介绍、 2 Go开发环境搭建 、3 第一个helloworld 、4 变量命名规范 、5 变量的
    目录1Go语言介绍2Go开发环境搭建3第一个helloworld4变量命名规范5变量的定义和使用1Go语言介绍#Go语言介绍Go即Golang,是Google公司2009年11月正式对外公开的一门编程语言Go是【静态强类型】语言,是区别于解析型语言的编译型语言(静态:类型固定强类型:不同类型不允许直接......
  • SpringMVC01_MVC的执行和注解开发
    一、SpringMVC概述​ SpringMVC是Spring框架的一个模块,因此SpringMVC无需和Spring进行整合就可以使用。SpringMVC是一个基于MVC的Web框架,即SpringWebMVC。SpringWebMVC和Struts2都属于表现层的框架,它是Spring框架的一部分。​<!--引入Spring框架的We......
  • java -- 注解
    注解注解概述定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。作用分类:编写文档:通过代码里标识的注解生成......
  • @Valid 和 @Validated 注解用法详解
     目录案例引入@Valid详解@Validated详解@Valid和@Validated比较  案例引入下面我们以新增一个员工为功能切入点,以常规写法为背景,慢慢烘托出@Valid和@Validated注解用法详解。那么,首先,我们会有一个员工对象Employee,如下:/***员工对象**@authors......
  • kubectl 命令 --save-config 将部署信息添加到注解,防止deploy或webhook通过注释添加
    1、--save-config为什么需要使用kubctlapply保存配置?kubectl apply<file.yaml>--save-config创建或更新部署,并将部署另存为元数据。文件上说--save-config[=false]:如果为true,则当前对象的配置将保存在其注释中。当您将来要对此对象执行kubectlapply时,这非常有用。为什么......
  • Go语言介绍、Go开发环境搭建、第一个helloworld、变量命名规范、变量的定义和使用
    目录1Go语言介绍2Go开发环境搭建3第一个helloworld4变量命名规范5变量的定义和使用1Go语言介绍#Go语言介绍Go即Golang,是Google公司2009年11月正式对外公开的一门编程语言Go是【静态强类型】语言,是区别于解析型语言的编译型语言(静态:类型固定强类型:不同类型不允许直接......
  • Java-Day-14( 枚举 + 注解 + 自设头文件 )
    Java-Day-14枚举(enumeration,enum)若是创建春夏秋冬四季的信息,如果按传统方法创建,无法固定信息,可以随时调改,所以要用枚举,做到只读且不能改枚举一组常量的集合——属于一种特殊的类,里面只包含一组有限的特定的对象实现方式自定义类实现枚举构造器私有化......
  • @RequestHeader注解:获取请求头参数
    1.前言SpringMVC提供了@RequestHeader注解,其作用是将请求头中的参数值映射到控制器的参数中。常用属性如下:name:header值被绑定到的参数名称(Thenameoftherequestheadertobindto)。只有此属性时,可以省略name,简写为@RequestHeader("User-Agent")。required:Boolean类型,......
  • 自定义注解获取当前登录信息
    登录注解/***@authorzhourui*@date2023/4/189:39*/importjava.lang.annotation.*;/***@authorzhourui*@date2023/4/1714:42*/@Documented@Target(ElementType.METHOD)@Retention(value=RetentionPolicy.RUNTIME)public@interfaceReLogin{}......
  • Spring 通过注解配置bean
    微信公众号:测试加油站关注可了解更多的测试开发技术。问题或建议,请公众号留言;如果你觉得文章对你有帮助,欢迎转发[1]Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置。Spring的java配置是通过这两个注解实现的,@Configuration和@Bean@Configuration作用到类上,相当一个xml......