java自定义注解并获取注解值

从JDK5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息


什么是注解编辑
注解,可以看作是对 一个 类/方法 的一个扩展的模版,每个 类/方法 按照注解类中的规则,来为 类/方法 注解不同的参数,在用到的地方可以得到不同的 类/方法 中注解的各种参数与值
注解也就是Annotation,相信不少人也和我之前一样以为和注释和doc一样,是一段辅助性的文字,其实注解不是这样的。
从JDK5开始,java增加了对元数据(描述数据属性的信息)的支持。其实说白就是代码里的特殊标志,这些标志可以在编译,类加载,运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进行部署。

java提供了5个基本的注解,分别是
1.@Override
2.@Deprecated
3.@SuppressWarnings
  
4.@SafeVarargs
5.@FunctionalInterface

  
1.限定父类重写方法:@Override
当子类重写父类方法时,子类可以加上这个注解,那这有什么什么用?这可以确保子类确实重写了父类的方法,避免出现低级错误
2.标示已过时:@Deprecated
这个注解用于表示某个程序元素类,方法等已过时,当其他程序使用已过时的类,方法时编译器会给出警告(删除线,这个见了不少了吧)。
3.抑制编译器警告:@SuppressWarnings
被该注解修饰的元素以及该元素的所有子元素取消显示编译器警告,例如修饰一个类,那他的字段,方法都是显示警告
4.“堆污染”警告与@SafeVarargs
想理解这个就要明白什么是堆污染,堆污染是什么?
其实很好理解,就是把不带泛型的对象赋给一个带泛型的对象,为什么不行?很简单,因为不带泛型的话,默认会给泛型设定为object,意思就是什么类型都可以往里面塞,那你一个不带泛型的怎么可能给一个带泛型塞呢。
例如运行如下代码:
List list = new ArrayList(); list.add(20); List<String> ls = list; System.out.println(ls.get(0));则会抛出堆污染异常Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at Test.Test1.main(Test1.java:29)
注意:可变参数更容易引发堆污染异常,因为java不允许创建泛型数组,可变参数恰恰是数组。
  抑制这个警告的方法有三个:
1.@SafeVarargs修饰引发该警告的方法或构造器
2.使用@suppressWarnings("unchecked")
3.编译时使用-Xlint:varargs
5.函数式接口与@Functionallnterface
什么是函数式?如果接口中只有一个抽象方法(可以包含多个默认方法或多个static方法)
接口体内只能声明常量字段和抽象方法,并且被隐式声明为publicstaticfinal。
接口里面不能有私有的方法或变量。
这个注解有什么用?这个注解保证这个接口只有一个抽象方法,注意这个只能修饰接口

自定义注解并获取注解值

package com.mfz.jav.annotation;

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

@Retention(RetentionPolicy.RUNTIME)
@Target(value = ElementType.TYPE)
public @interface MyTable {

    String tableName();
}

package com.mfz.jav.annotation;

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

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyColumn {

    String columnName();
    String type();
    int length();
}


package com.mfz.jav.an01;

import com.mfz.jav.annotation.MyColumn;
import com.mfz.jav.annotation.MyTable;

@MyTable(tableName = "my_student_tb")
public class MyStudent {

    @MyColumn(columnName = "id",type = "int",length = 11)
    private Integer id;
    @MyColumn(columnName = "stu_name",type = "varchar",length = 30)
    private String name;
    @MyColumn(columnName = "stu_age",type = "int",length = 3)
    private int age;
    @MyColumn(columnName = "stu_address",type = "varchar",length = 150)
    private String address;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

package com.mfz.jav.an01;

import com.alibaba.fastjson.JSON;
import com.mfz.jav.annotation.MyColumn;
import com.mfz.jav.annotation.MyTable;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class StuDemo {

    public static void main(String[] args){

        try{

            Class clazz = Class.forName("com.mfz.jav.an01.MyStudent");

            Annotation[] annotations = clazz.getAnnotations();
            /**for (Annotation annotation:annotations){
                //System.out.println(annotation);
            }*/

            //获取表名
            MyTable table = (MyTable) clazz.getAnnotation(MyTable.class);
            String tableName = table.tableName();
            System.out.println("tableName:"+tableName);
            //获取字段上的注解
            Map<String,Object>  idColumnPros = getColumnPros(clazz,"id");
            Map<String,Object>  nameColumnPros = getColumnPros(clazz,"name");
            Map<String,Object>  ageColumnPros = getColumnPros(clazz,"age");
            Map<String,Object>  addressColumnPros = getColumnPros(clazz,"address");


            System.out.println(JSON.toJSONString(idColumnPros,true));
            System.out.println(JSON.toJSONString(nameColumnPros,true));
            System.out.println(JSON.toJSONString(ageColumnPros,true));
            System.out.println(JSON.toJSONString(addressColumnPros,true));

        }catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 获取指定属性上的注解值
     * @param clazz
     * @param fieldName
     * @return
     * @throws Exception
     */
    private static Map<String,Object> getColumnPros(Class clazz,String fieldName) throws Exception{

        //获取字段名
        Field field = clazz.getDeclaredField("id");
        Map<String,Object>  columnsPro = new HashMap<>();
        MyColumn column = field.getAnnotation(MyColumn.class);
        columnsPro.put("columnName",column.columnName());
        columnsPro.put("type",column.type());
        columnsPro.put("length",column.length());
        return columnsPro;
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java自定义注解获取用户信息,您可以按照以下步骤进行操作: 1. 创建自定义注解:使用`@interface`关键字创建一个新的注解类型。例如,您可以创建一个名为`UserInfo`的注解获取用户信息。 ```java import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface UserInfo { String name(); int age(); String email() default ""; } ``` 在上面的例子,`UserInfo`注解定义了三个元素:`name`、`age`和`email`。`name`和`age`是必需的元素,而`email`是可选的元素。 2. 使用自定义注解:在您需要使用自定义注解的地方,将其应用于类、方法或者字段上。例如,您可以将`UserInfo`注解应用于类上。 ```java @UserInfo(name = "John Doe", age = 30, email = "[email protected]") public class MyClass { // class implementation } ``` 3. 获取注解信息:通过反射机制,您可以在运行时获取应用了注解的类、方法或字段的信息。以下是一个获取类上`UserInfo`注解信息的示例: ```java import java.lang.annotation.Annotation; public class Main { public static void main(String[] args) { Class<MyClass> clazz = MyClass.class; if (clazz.isAnnotationPresent(UserInfo.class)) { UserInfo userInfo = clazz.getAnnotation(UserInfo.class); System.out.println("Name: " + userInfo.name()); System.out.println("Age: " + userInfo.age()); System.out.println("Email: " + userInfo.email()); } } } ``` 上面的例子,首先获取`MyClass`的`Class`对象,然后使用`isAnnotationPresent`方法判断该类是否应用了`UserInfo`注解。如果存在该注解,则使用`getAnnotation`方法获取注解的实例,并通过相应的方法获取注解元素的。 这样,您就可以自定义注解获取用户信息了。请根据您的需求进行适当的调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值