zoukankan      html  css  js  c++  java
  • java开发注解大全

    目录

    1、最基础注解(spring-context包下的org.springframework.stereotype)

    1.1、@Controller @Service @Repository @Configuration @Component

    (1)解释

    用于标注各个层级的注解,注入到spring容器管理
    @Controller @Service @Repository @Configuration 都是@Component组合注解只是区分层级关系

    注解 层级
    @Controller 标注于控制层
    @Service 标注于业务层
    @Repository 标注于dao持久层
    @Configuration 标注于配置层
    @Component 泛指组件,当组件不好归类时可用
    (2)示例
    @Controller
    public class UserController {
    
    }
    

    1.2、 @Bean

    (1)解释

    @Bean等价于< Bean >< /Bean >,添加的bean的id为方法名。

    (2)例子

    @Configuration
    public class AppConfig {
    	//@bean 也可以依赖其他任意数量的bean,如果TransferService 依赖 AccountRepository,我们可以通过方法参数实现这个依赖
        @Bean
        public TransferService transferService(AccountRepository accountRepository) {
            return new TransferServiceImpl(accountRepository);
        }
    }
    

    这个配置就等同于之前在xml里的配置:
    @Configuration可理解为用spring的时候xml里面的< beans >标签
    @Bean可理解为用spring的时候xml里面的< bean >标签

    <beans>
        <bean id="transferService" class="com.acme.TransferServiceImpl"  depends-on="accountRepository"/>
    </beans>
    

    2、最基础注解(spring-web包下的org.springframework.web.bind.annotation)

    2.1、@ResponseBody

    (1)解释

    该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中。
    一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。

    (2)例子

    /***********************例子一*******************************/
    @RequestMapping(value="user/login")
    @ResponseBody
    //将ajax(datas)发出的请求写入User对象中,返回json对象响应回去
    public User login(User user) {
        User user = new User();
        user.setUserid(1);
        user.setUsername("MrF");
        user.setStatus("1");    
        return user ;
    }
    /***********************例子二*******************************/
    @Controller 
    public class UserController {
    	@GetMapping("/hello") 
    	@ResponseBody public String hello() {
    		return "hello spring"; 
    	} 
    }
    
    

    2.2、@RequestBody

    (1)解释

    将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。换句话就是:用于接收前端请求的Json参数,并且封装到对应的JavaBean

    (2)例子

    @RequestMapping(value = "user/login")
    @ResponseBody
    // 将ajax(datas)发出的请求写入User对象中
    public User login(@RequestBody User user) {   
    // 这样就不会再被解析为跳转路径,而是直接将user对象写入 HTTP 响应正文中
        return user;    
    }
    

    (3)使用时机

    A) GET、POST方式提时, 根据request header Content-Type的值来判断:

    application/x-www-form-urlencoded,可选(即非必须,因为这种情况的数据@RequestParam,@ModelAttribute也可以处理,当然@RequestBody也能处理);
    multipart/form-data,不能处理(即使用@RequestBody不能处理这种格式的数据);
    其他格式,必须(其他格式包括application/json,application/xml等。这些格式的数据,必须使用@RequestBody来处理);

    B) PUT方式提交时, 根据request header Content-Type的值来判断:

    application/x-www-form-urlencoded,必须;multipart/form-data,不能处理;其他格式,必须;

    2.3、@RequestMapping

    (1)解释

    用来处理请求地址映射的注解

    (2)例子

    /**
    * 用于类上,可以没有
    */
    @RequestMapping(value = "/controllerDemo")
    public class ControllerDemo {
        // 用于方法上,必须有
        @RequestMapping(value = "/methodDemo")    
        public String methodDemo() {
            return "helloWorld";
        }
    }
    
    

    (3)注解参数

    RequestMapping注解有六个属性,下面我们把她分成三类进行说明。
    1、value, method
    value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明)
    method:指定请求的method类型,GET、POST、PUT、DELETE等
    2、consumes,produces
    consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
    produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
    3、params,headers
    params:指定request中必须包含某些参数值是,才让该方法处理。
    headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。

    2.4、@PostMapping

    (1)解释

    一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。

    (2)例子

    	@PostMapping("/pay")
    	public JsonResponse pay(HttpServletRequest request){}
    

    2.5、@GetMapping

    (1)解释

    一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。

    (2)例子

    @GetMapping("/getAll/{companyName}")
    public ReturnModel getAllBusByCompany(@PathVariable(value="companyName",required=false)String companyName){}
    

    2.6、@PathVariable

    (1)解释

    用于接受前端url路径参数,通过路径参数作为接口接受的参数,Result风格
    区分:
    使用@RequestParam时,URL是这样的:http://host:port/path?参数名=参数值
    使用@PathVariable时,URL是这样的:http://host:port/path/参数值

    (2)例子

    访问路径:localhost:8080/hello/1

        @GetMapping("/hello/{id}")
        public String func(@PathVariable String id) {
            return id;
        }
    

    (3)参数

    返回值 参数 作用
    String value name别名
    String name url参数的绑定值

    2.7、@RequestParam

    (1)解释

    用于接受前端提交的参数

    (2)参数

    返回值 参数 作用
    String value name别名
    String name 请求参数对应的属性
    boolean required 是否必传
    Stirng defaultValue 默认值

    (2)例子

    访问方式:localhost:8080/hello?name=张三

        @GetMapping("/hello")
        public String func(@RequestParam(name = "name", required = false, defaultValue = "张三") String name) {
            return "OK";
        }
    

    2.8、@RestController

    (1)解释

    相当于@ResponseBody + @Controller,Controller中的方法无法返回jsp页面,
    返回的内容就是Return 里的内容。

    3、persistence注解(javax.persistence包下的javax.persistence)

    3.1、@Entity,@Table,@Id,@GeneratedValue, @Column,@Temporal,@Generated

    (1)解释

    • @Entity表明该类是实体类,并且使用默认的orm规则,即class名即数据库表中表名,class字段名即表中的字段名。如果class名和数据库表中名字不一致就用@Table,如果class字段名和表中的字段名不一直就用@Column
    • @Column用来标识实体类中属性与数据表中字段的对应关系

    name定义了被标注字段在数据库表中所对应字段的名称;
    unique表示该字段是否为唯一标识,默认为false。如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table标记中的@UniqueConstraint。
    nullable表示该字段是否可以为null值,默认为true。
    insertable表示在使用“INSERT”脚本插入数据时,是否需要插入该字段的值。
    updatable表示在使用“UPDATE”脚本插入数据时,是否需要更新该字段的值。insertable和updatable属性一般多用于只读的属性,例如主键和外键等。这些字段的值通常是自动生成的。
    columnDefinition表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。(也就是说,如果DB中表已经建好,该属性没有必要使用。)
    table表示当映射多个表时,指定表的表中的字段。默认值为主表的表名。
    length表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。
    precision和scaleprecision属性和scale属性表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。

    • @Id表名该字段是主键,如果要开启自增主键就用@GeneratedValue
    • @Temporal帮Java的Date类型进行格式化,一共有三种注解值

    第一种:@Temporal(TemporalType.DATE)——>实体类会封装成日期“yyyy-MM-dd”的 Date类型。
    第二种:@Temporal(TemporalType.TIME)——>实体类会封装成时间“hh-MM-ss”的 Date类型。
    第三种:@Temporal(TemporalType.TIMESTAMP)——>实体类会封装成完整的时间“yyyy-MM-dd hh:MM:ss”的 Date类型。

    • @Generated自动生成

    generated= never 标明此属性值不是从数据库中生成。
    generated默认值是never。
    generated= insert 标明此属性值在insert的时候生成,但是不会在随后的update时重新生成。
    generated= always 标明此属性值在insert和update时都会被生成

    (2)例子

    import org.hibernate.annotations.Generated;
    import org.hibernate.annotations.GenerationTime;
    import javax.persistence.*;
    import java.util.Date;
    
    @Entity
    @Table(name = "batch")
    public class Batch{
    
        @Id
        @GeneratedValue(strategy= GenerationType.AUTO)
        private Integer id;
    	
    	//在插入的时候自动赋值当前时间
        @Column(insertable = false)
        @Temporal(TemporalType.TIMESTAMP)   
        @Generated(GenerationTime.INSERT)   
        private Date createdTime;
    
        //自动变化更新时间
        @Temporal(TemporalType.TIMESTAMP)
        @Column(insertable = false, updatable = false)
        @Generated(GenerationTime.ALWAYS)
        private Date updatedTime;
        
    	//在插入的时候自动赋值1
        @Column(insertable = false ,columnDefinition="Short default 1")
        @Generated(GenerationTime.INSERT)
        private Short status;
    
    

    4、resteasy注解(jaxrs-api包下的javax.ws.rs)

    resteasy 是java体系中比较成熟的rest框架,也是jax-rs规范的实现之一,dubbox的REST服务框架,就是采用的resteasy实现。
    默认情况下,resteasy使用jackson和jaxb来实现json及xml格式的序列化。应用启动时,会自动扫描带@Provider的包,找到最合适的provider。
    这个可以用来做分布式,可以通过okhttp3协议来进行交互

    4.1、@Path、@POST、@Produces、@Consumes、@Context

    (1)例子

    import com.alibaba.dubbo.rpc.protocol.rest.support.ContentType;
    import com.tdpay.dubbo.common.response.JsonResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.ws.rs.Consumes;
    import javax.ws.rs.POST;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.Context;
    
    @Path("/td")
    public interface PayIntegrationService {
    
    	@Path("/pay")
    	@POST
    	@Produces({ ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})
    	@Consumes({ ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})
    	public JsonResponse pay(@Context HttpServletRequest request);
    }
    

    5、validation注解(validation-api包下的javax.validation)

    5.1、@Valid 和 @属性校验注解

    (1)解释

    用于前端请求参数校验,@Valid需要配合BindingResult使用,以及配合下面各种校验注解进行使用

    (2)注解参数

    注解 作用
    @Valid 进行校验前端入参
    注解 作用
    @Null 限制只能为null
    @NotNull 限制必须不为null
    @AssertFalse 限制必须为false
    @AssertTrue 限制必须为true
    @DecimalMax(value) 限制必须为一个不大于指定值的数字
    @DecimalMin(value) 限制必须为一个不小于指定值的数字
    @Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
    @Future 限制必须是一个将来的日期
    @Max(value) 限制必须为一个不大于指定值的数字
    @Min(value) 限制必须为一个不小于指定值的数字
    @Past 限制必须是一个过去的日期
    @Pattern(value) 限制必须符合指定的正则表达式
    @Size(max,min) 限制字符长度必须在min到max之间
    @Past 验证注解的元素值(日期类型)比当前时间早
    @NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
    @NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
    @Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

    (3)示例

        /**
         * 接受前端的请求并且根据User实体类注解进行校验
         */
        @PostMapping("/hello/user")
        public String hello(@Valid @RequestBody User user, BindingResult result) {
            if (result.hasErrors()) {
                result.getAllErrors().forEach(System.out::println);
            }
            System.out.println(user);
            return "hello spring";
        }
    
    @Data
    public class User {
    
        @NotBlank(message = "用户名不能为空")
        private String username;
    
        @NotBlank(message = "密码名不能为空")
        private String password;
    }
    

    6、lombok常用注解

    idea要下载lombok插件
    打开IDEA的Setting –> 选择Plugins选项 –> 选择Browse repositories –> 搜索lombok –> 点击安装 –> 安装完成重启IDEA –> 安装成功
    然后pom导入lombok包

    <dependency>  
        <groupId>org.projectlombok</groupId>  
        <artifactId>lombok</artifactId>  
        <version>1.18.0</version>  
        <scope>provided</scope>  
    </dependency> 
    

    6.1、@Slf4j和@Log

    (1)解释

    @Slf4j: 注解在类上,为类提供一个属性名为 log 的 log4j 的日志对象,避免重复代码。(基于lombok包)
    @Log:使用的是 java.util.logging.Logger ,直接使用变量 log,用法同上。

    (2)示例

    @Service
    @Slf4j
    public class UserService {
    
        public void func() {
            log.info("【使用{}】","@Slf4j");
        }
    }
    

    6.2、@Data

    (1)解释

    用在pojo类,在类上面加这个注解。简化java代码编写,为该类提供读写属性,还提供了equals(),hashCode(),toString()方法。
    等价于 @ToString、@Getter、@Setter、@EqualsAndHashCode、@NoArgsConstructor

    注意:同时使用@Data 和 @AllArgsConstructor 后 ,默认的无参构造函数失效,如果需要它,要重新设置 @NoArgsConstructor

    (2)例子

    @Data
    public class ActivityListParam{
        private Integer id;
        private Integer page;
        private Integer count;
        ...
    
    }
    

    6.3、@Getter,@Setter,@ToString,@EqualsAndHashCode

    (1)解释

    在pojo类上面加了这些注解以后,自动生成get、set、toString、equals、hashCode等方法
    @EqualsAndHashCode(callSuper = false)的意思是忽略父类的字段,来调用equals和hashcode

    6.4、@AllArgsConstructor、@NoArgsConstructor

    (1)解释

    @AllArgsConstructor
    在pojo类上面加了这些注解以后,会生成一个包含所有变量的构造函数,同时如果变量使用了NotNull annotation , 会进行是否为空的校验,
    全部参数的构造函数的自动生成,该注解的作用域也是只有在实体类上,参数的顺序与属性定义的顺序一致

    @NoArgsConstructor
    在pojo类上面加了这些注解以后,会生成一个无参构造函数

    6.5、@NonNull

    (1)解释

    该注解用在属性或构造器上,Lombok会生成一个非空的声明,可用于校验参数,能帮助避免空指针。

    (2)例子

    public class Person {
     	 private String name;
      
    	public NonNullExample(@NonNull Person person) {
    	  super("Hello");
    	  this.name = person.getName();
    	}
      
      	@NonNull
    	public List<Person> getMembers() {
    	  return members;
    	}
    }
    

    6.6、@Cleanup

    (1)解释

    该注解能帮助我们自动调用close()方法,很大的简化了代码。

    (2)例子

        import lombok.Cleanup;
        import java.io.*;
        
        public class CleanupExample {
          public static void main(String[] args) throws IOException {
            @Cleanup InputStream in = new FileInputStream(args[0]);
            @Cleanup OutputStream out = new FileOutputStream(args[1]);
            byte[] b = new byte[10000];
            while (true) {
              int r = in.read(b);
              if (r == -1) break;
              out.write(b, 0, r);
            }
          }
        }
    

    如不使用Lombok,则需如下:

    import java.io.*;
    
    public class CleanupExample {
      public static void main(String[] args) throws IOException {
        InputStream in = new FileInputStream(args[0]);
        try {
          OutputStream out = new FileOutputStream(args[1]);
          try {
            byte[] b = new byte[10000];
            while (true) {
              int r = in.read(b);
              if (r == -1) break;
              out.write(b, 0, r);
            }
          } finally {
            if (out != null) {
              out.close();
            }
          }
        } finally {
          if (in != null) {
            in.close();
          }
        }
      }
    }
    

    6.7、@Builder

    (1)解释

    声明实体,表示可以进行Builder方式初始化

    (2)例子

    /**
     * toBuilder 允许修改属性
     */
    @Builder(toBuilder = true)
    @Getter
    public class User {
        private String name;
        private String password;
    }
    
        @Test
        public void contextLoads() {
            // 创建对象并且赋值
            User user = User.builder().name("123").password("456").build();
            
            // 修改对象属性值
            User updateUser = user.toBuilder().name("张三").password("123").build();
        }
    

    7、tkMapper注解

    不知道怎么用tkMapper查看我的另一个文章:https://blog.csdn.net/ranandrun/article/details/86509394

    7.1、@Select、@Param

    • @Param作用是用于传递参数,从而可以与SQL中的的字段名相对应,一般在2=<参数数<=5时使用最佳
    • @Select作用是用注解方式来查询,不需要通过mapperxml文件
    import com.td.pay.tdpay.entity.PayParamsModel;
    import org.apache.ibatis.annotations.Param;
    import org.apache.ibatis.annotations.Select;
    import org.springframework.stereotype.Repository;
    import tk.mybatis.mapper.common.Mapper;
    
    @Repository
    public interface PayParamsDao extends Mapper<PayParamsModel> {
    	/**
    	 * 根据sn查询订单
    	 */
    	@Select("SELECT * FROM pay_params WHERE sn = #{sn};")
    	public PayParamsModel selectBySn(@Param("sn") String srcOrderSn);
    }
    
    

    8、springboot常用注解

    8.1、@ConfigurationProperties

    (1)解释

    将配置文件中配置的每一个属性的值,映射到这个组件中

    (2)例子

    **
     * @ConfigurationProperties:
     *      prefix = "person":配置文件下面的所有属性和类的属性进行一一映射
     *
     * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
     *
     */
    @Component
    @ConfigurationProperties(prefix = "person")
    public class Person {
    
        private String lastName;
        private Integer age;
        private Boolean boss;
        private Date birth;
    
        private Map<String,Object> maps;
        private List<Object> lists;
        private Dog dog;
    
    

    配置文件

    person:
        lastName: hello
        age: 18
        boss: false
        birth: 2017/12/12
        maps: {k1: v1,k2: 12}
        lists:
          - lisi
          - zhaoliu
        dog:
          name: 小狗
          age: 12
    

    我们可以导入配置文件处理器,以后编写配置就有提示了

    <!--导入配置文件处理器,配置文件进行绑定就会有提示-->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-configuration-processor</artifactId>
    			<optional>true</optional>
    		</dependency>
    

    8.2、@MapperScan("com.test.dao")

    扫描dao接口,放启动类上面

    8.3、@SpringBootApplication(scanBasePackages = {"com.test"})

    SpringBootApplication启动时会默认扫描主类当前包及子包,如果需要扫描主类当前包外的其他包就用@SpringBootApplication

    9、注入bean的三个注解

    归纳:

    • @Autowired是spring自带的,@Inject是JSR330规范实现的,@Resource是JSR250规范实现的,需要导入不同的包
    • @Autowired、@Inject用法基本一样,不同的是@Autowired有一个request属性
    • @Autowired、@Inject是默认按照类型匹配的,@Resource是按照名称匹配的
    • @Autowired如果需要按照名称匹配需要和@Qualifier一起使用,@Inject和@Name一起使用

    9.1、@Inject(javax.inject下的)

    (1)解释

    根据类型进行自动装配的,默认需要配置与变量名一致。如果需要按名称进行装配,则需要配合@Named;
    @Inject可以作用在变量、setter方法、构造函数上。

    (2)例子

        @Inject
        private Mongo mongo;
    

    9.2、@Autowired ( org.springframework下的sping-beans)

    (1)解释

    根据类型进行自动装配的,名称不一样也没事,如果需要按名称进行装配,则需要配合@Qualifier;
    @Autowired有个属性为required,可以配置为false,如果配置为false之后,当没有找到相应bean的时候,系统不会抛错;
    @Autowired可以作用在变量、setter方法、构造函数上。

    (2)例子

        @Autowired
        private MongoTemplate mongoTemplate;
    

    9.3、 @Resource (jdk下的rt.jar下的javax.annotation)

    (1)解释

    根据名称进行自动装配的,默认需要配置与变量名一致,一般会指定一个name属性。
    @Resource可以作用在变量、setter方法上。

    (2)例子

        @Resource(name = "userMapper")
        private UserMapper userMapper;
    

    10、java内置注解(java.lang下的)

    10.1、@Override

    (1)解释

    帮助自己检查是否正确的复写了父类中已有的方法
    告诉读代码的人,这是一个复写的方法

    (2)例子

    public class Apple extends Fruit{
         @Override
         public void show_name(int num){
             System.out.println("Apple");
        }
    }
    

    10.2、@Deprecated

    (1)解释

    这个方法或类不再建议使用。调用时也会出现删除线,但并不代表不能用。在新版本中有其他方法或类可以代替这个使用,以后的版本也不会再更新这个方法或类

    (2)例子

         /**
         * 请改用每个实体对象的实例方法的existed()方法。
         */
        @Deprecated
        public static <T extends Entity> boolean exists(Class<T> clazz, Serializable id) {
            return getRepository().exists(clazz, id);
        }
    

    10.3、@SuppressWarnings

    (1)解释

    抑制内容警告,我们使用是要保证抑制影响的范围最小。
    @ SuppressWarnings可以使用的属性列表如下:

    属性 备注
    all 禁止所有警告
    boxing 禁止与装箱/拆箱操作相关的警告
    cast 强制转换以抑制与强制转换操作相关的警告
    dep-ann 用于抑制相对于已弃用注释的警告
    deprecation 弃用以抑制相对于弃用的警告
    fallthrough 在switch语句中,通过fallthrough来抑制与丢失中断相关的警告
    finally 最后抑制与最终块相关的不返回的警告
    hiding 隐藏以抑制相对于隐藏变量的本地警告
    incomplete-switch 在switch语句(enum案例)中,incomplete-switch用来抑制相对于丢失条目的警告
    javadoc 禁止与javadoc警告相关的警告
    nls 使用nls来抑制相对于非nls字符串的警告。
    null 空值来抑制相对于空值分析的警告
    rawtypes 拒绝与使用原始类型相关的警告
    resource 用于抑制与使用类型为Closeable的资源相关的警告的资源
    restriction 限制禁止与使用不鼓励或禁止引用相关的警告
    serial 串行用于抑制相对于可串行化类缺少serialVersionUID字段的警告
    static-access 静态访问,抑制相对于不正确的静态访问的警告
    static-method 静态方法,用于抑制相对于可以声明为静态的方法的警告
    super 超级-来抑制相对于在没有超级调用的情况下重写方法的警告
    synthetic-access 用于抑制相对于内部类的未优化访问的警告的合成访问
    sync-override 在覆盖同步方法时,由于缺少同步而取消警告
    unchecked 未选中以抑制与未选中操作相关的警告
    unqualified-field-access 不限定字段访问来抑制与字段访问不限定相关的警告
    unused 不常用来抑制与未使用代码和死代码相关的警告

    (2)例子

    public class SuppressWarnings {
    
        /**
         * 变量单个类型的警告
         */
        @java.lang.SuppressWarnings("unused")
        public void unused() {
            String s = "";
        }
    
        /**
         * 抑制多个类型的警告
         * @param item 元素
         */
        @java.lang.SuppressWarnings({"unchecked", "rawtypes"})
        public void addItems(String item){
            List items = new ArrayList();
            items.add(item);
        }
    
        /**
         * 抑制所有类型的警告
         * @param item
         */
        @java.lang.SuppressWarnings("all")
        public void all(String item) {
            List items = new ArrayList();
            items.add(item);
        }
    }
    

    10.4、@SafeVarargs

    (1)解释

    抑制堆污染警告
    问:什么时候会出现对堆污染警告?
    答:使用泛型+可变参数的时候就会出现堆污染警告。

    (2)例子

    
            @SafeVarargs
    	public static<T> T useVarargs(T... args){
    		return args.length > 0?args[0]:null;
    	}
    	@Test
    	public void testSafeVarargs(){
    		System.out.println(useVarargs(Arrays.asList("s1","s2")));
    	}
    

    10.5、@FunctionalInterface

    (1)解释

    在Java SE 8中引入的 ,申明某个接口是函数式接口(函数式接口是就只含有一个抽象方法的接口)。加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错。该注解只是提醒编译器去检查该接口是否仅包含一个抽象方法。

    (2)例子

    如定义了一个函数式接口如下:

        @FunctionalInterface
        interface GreetingService 
        {
            void sayMessage(String message);
        }
    

    那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的):

    GreetingService greetService1 = message -> System.out.println("Hello " + message);
    
  • 相关阅读:
    .Net Core DI依赖注入:一个接口注入多个实现类(转载)
    单表千万行数据库 LIKE 搜索优化手记(链接)
    Do the JSON keys have to be surrounded by quotes?(转载)
    梳理情绪解决问题
    MYSQL主从数据库同步备份配置的方法
    VMware ESXI 6.5 安装及配置
    linux centos7 完整邮件服务器搭建及调用_2018_lcf
    利用Tampermonkey(油猴)+ IDM 实现百度云盘大文件下载(IDM安装教程)
    Java中使用feign遇到的坑
    微服务为什么要有服务发现与注册?
  • 原文地址:https://www.cnblogs.com/ranandrun/p/annotation.html
Copyright © 2011-2022 走看看