「java怎么自定义注释」自定义java注解

博主:adminadmin 2022-11-21 19:10:08 58

今天给各位分享java怎么自定义注释的知识,其中也会对自定义java注解进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

如何实现自定义Java运行时注解功能

相信大家在Android开发过程中,对注解有一定程度的接触,比如我们在使用EventBus的时候,我们声明

@Subscribe(threadMode = ThreadMode.MainThread)

来接受通过EventBus发出来的数据,

还有ButterKnife,我们在使用OnClick添加点击事件或Bind绑定组件的时候,同样也有类似的写法

@Bind(R.id.index_image)

@OnClick({R.id.index_layout)

以至于什么@Override、@Deprecated、@SuppressWarnings这就不需要说了。

我们在写的时候,最大的感触就是:太方便了!!!直接加一个声明就Ok了。你是不是心动了,自己也写几个注解,是不是程序能够更加简洁一些了?先别急,看看注解的结构

@Retention(CLASS)

@Target(FIELD)

public @interface Bind {

/** View ID to which the field will be bound. */

int[] value();

}

其实一点概念都不知道的话,确实看到这个会懵逼。我们一个个来解释一下

Retention 表示在什么级别保留此信息

SOURCE:源码注解,注解仅存在代码中,注解会被编译器丢弃

CLASS:编译时注解,注解会在class文件中保留,但会被VM丢弃

RUNTIME:运行时注解,VM运行期间也会保留该注解,因此可以通过反射来获得该注解

Target 表示作用域,可能的ElementType参数包括:

CONSTRUCTOR:构造方法声明

FIELD:字段声明

LOCAL_VARIABLE:局部变量声明

METHOD:方法声明

PACKAGE:包声明

PARAMETER:参数声明

TYPE:类,接口或enum声明

Inherited 容许子类继承

Documented 生成javadoc时会包含注解

Java ,自定义注解怎么使用

java中自定义注解的使用方法:

首先声明一个接口,并未它添加注解内容!

package testAnnotation;

import java.lang.annotation.Documented;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

@Documented

@Retention(RetentionPolicy.RUNTIME)

public @interface Person{

String name();

int age();

}

2、然后利用反射机制查看类的注解内容

package testAnnotation;

@Person(name="xingoo",age=25)

public class test3 {

public static void print(Class c){

System.out.println(c.getName());

//java.lang.Class的getAnnotation方法,如果有注解,则返回注解。否则返回null

Person person = (Person)c.getAnnotation(Person.class);

if(person != null){

System.out.println("name:"+person.name()+" age:"+person.age());

}else{

System.out.println("person unknown!");

}

}

public static void main(String[] args){

test3.print(test3.class);

}

}

运行结果,读取到了注解的内容

testAnnotation.test3

name:xingoo age:25

「java怎么自定义注释」自定义java注解

如何创建,使用以及解析自定义注解

首先要想使用自定义注解,必须创建自己的注解类

右键项目,new - Annotation

然后在注解里定义自己的方法,该方法是别的类使用注解时需要填的属性

package com.sy.demo.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Table {public String value();}

注:如果只有一个方法时,应该用value()来指定方法名,这样就可以直接简写@Table("xxx")而不是@Table(aaa="xxx");

其中注解类上的注解称为元注解

@Target(ElementType.TYPE)

@Target的意思是,该注解类是放在什么位置的,是放在类上、字段上还是方法上,ElementType.TYPE意思是只能放在类上或接口上,ElementType.FIELD意思是只能放在字段上等等。

如果有多个位置选择可以这么写:

@Target({ElementType.TYPE, ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

意思是作用域,一般写RUNTIME就行

@Documented

意思是是否在生成JavaDoc时加入该注解类,这个看情况写不写

还有其他元注解,想要研究的就自己研究吧

定义完自定义注解了,下面就是使用的时候了

package com.sy.demo.entity;import com.sy.demo.annotation.Column;import com.sy.demo.annotation.Table;@Table("tdb_user")public class User { @Column("id") private Long id; @Column("email") private String email; @Column("password") private String password; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}

在这里我定义了一个实体类,用于表示用户信息,其中还是用了一个@Column类,代码如下

package com.sy.demo.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Column { public String value();}

由代码可知,@Column是放在field上的

使用也使用完了,下面该是解析的时候了。

package com.sy.demo.util;import java.lang.reflect.Field;import com.sy.demo.annotation.Column;import com.sy.demo.annotation.Table;public class SqlUtil { private static final String EMPTY = ""; @SuppressWarnings("unchecked") public static String getSql(Object object) { StringBuilder sb = new StringBuilder(); ClassObject c; boolean isExist; Column column; String columnName; String getMethodName; Object columnValue; String[] strs; try { c = (ClassObject) object.getClass(); isExist = c.isAnnotationPresent(Table.class); if (!isExist) { return EMPTY; } Table table = c.getAnnotation(Table.class); sb.append(" SELECT * FROM " + table.value() + " WHERE 1 = 1 " ); Field[] fields = c.getDeclaredFields(); for (Field field: fields) { isExist = field.isAnnotationPresent(Column.class); if (!isExist) { continue; } column = field.getAnnotation(Column.class); columnName = column.value(); getMethodName = "get" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1); columnValue = c.getMethod(getMethodName, new Class[0]).invoke(object, new Object[0]); if (columnValue == null) { continue; } if (columnValue instanceof String) { columnValue = (String)columnValue; if(((String) columnValue).contains(",")) { sb.append("AND " + columnName + " IN ("); strs = ((String) columnValue).split(","); for(String str: strs) { sb.append("'" + str + "',"); } sb.deleteCharAt(sb.length() - 1); sb.append(") "); } else { sb.append("AND " + columnName + " = '" + columnValue + "' "); } } else if (columnValue instanceof Integer || columnValue instanceof Long) { sb.append("AND " + columnName + " = " + columnValue + " "); } } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); }}

解析的时候用的是反射机制,可能看着比较麻烦比较乱,而且也新手可能也不太理解,在用的时候会发现其实还是挺方便的。

原理解释根据反射找到User类,在判断是否有注解,接着拼接sql什么的

整个列子项目中完整的代码如下(有许多步骤测试用例,懒得删了,全贴出来吧)

Controller

package com.sy.demo.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.sy.demo.entity.User;import com.sy.demo.service.IUserService;@Controller@RequestMapping("hello")public class UserController { @Autowired private IUserService hService; @RequestMapping(value = "demo1") public String demo1() { return "demo1"; } @SuppressWarnings("deprecation") @RequestMapping(value = "demo2") public String demo2() { return hService.test(); } @RequestMapping(value = "demo3") @ResponseBody public String demo3() { User user = new User(); user.setId(1L); user.setEmail("mr_songyang1990@163.com"); user.setPassword("1q2w3e4r,123456,aaaaa"); return hService.getUser(user); } @RequestMapping(value = "demo4") @ResponseBody public String demo4() { User user = new User(); user.setId(1L); user.setEmail("mr_songyang1990@163.com"); user.setPassword("1q2w3e4r,123456,aaaaa"); return hService.getUser2(user); }}

service:

package com.sy.demo.service;import com.sy.demo.entity.User;public interface IUserService { @Deprecated public String test(); public String getUser(User user); public String getUser2(User user);}

package com.sy.demo.service.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.sy.demo.entity.User;import com.sy.demo.repository.IUserRepository;import com.sy.demo.service.IUserService;@Service("hService")public class UserServiceImpl implements IUserService { @Autowired private IUserRepository hRepository; @Deprecated @Override public String test() { return "demo2"; } @Override public String getUser(User user) { return hRepository.queryUser(user); } @Override public String getUser2(User user) { return hRepository.queryUser2(user); }}

Repository

package com.sy.demo.service.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.sy.demo.entity.User;import com.sy.demo.repository.IUserRepository;import com.sy.demo.service.IUserService;@Service("hService")public class UserServiceImpl implements IUserService { @Autowired private IUserRepository hRepository; @Deprecated @Override public String test() { return "demo2"; } @Override public String getUser(User user) { return hRepository.queryUser(user); } @Override public String getUser2(User user) { return hRepository.queryUser2(user); }}

package com.sy.demo.repository.impl;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import org.springframework.stereotype.Repository;import com.sy.demo.entity.User;import com.sy.demo.repository.IUserRepository;import com.sy.demo.util.DBUtil;import com.sy.demo.util.SqlUtil;@Repository("hRepository")public class UserRepositoryImpl implements IUserRepository { public String queryUser(User user) { String sql = SqlUtil.getSql(user); System.out.println(sql); return sql; } @Override public String queryUser2(User user) { StringBuilder sb = new StringBuilder(); String sql = SqlUtil.getSql(user); System.out.println(sql); PreparedStatement ps = DBUtil.getPreparedStatement(sql); Long id; String email; String password; try { ResultSet rs = ps.executeQuery(); while (rs.next()) { id = rs.getLong("id"); email = rs.getString("email"); password = rs.getString("password"); sb.append("ID:").append(id).append(", email:"). append(email).append(", password:").append(password).append("br/"); } } catch (SQLException e) { e.printStackTrace(); } return sb.toString(); }}

entity:

package com.sy.demo.entity;import com.sy.demo.annotation.Column;import com.sy.demo.annotation.Table;@Table("tdb_user")public class User { @Column("id") private Long id; @Column("email") private String email; @Column("password") private String password; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}

annotation

package com.sy.demo.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Table { public String value();}

package com.sy.demo.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Column { public String value();}

util工具类

package com.sy.demo.util;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;public class DBUtil { public static final String URL = "jdbc:mysql://localhost:3306/db_test"; public static final String USERNAME = "root"; public static final String PASSWORD = "root"; public static Connection conn = null; public static MysqlDataSource dataSource; static { dataSource = new MysqlDataSource(); dataSource.setUser(USERNAME); dataSource.setPassword(PASSWORD); dataSource.setURL(URL); } public static PreparedStatement getPreparedStatement(String sql) { try { conn = dataSource.getConnection(); return conn.prepareStatement(sql); } catch (SQLException e) { e.printStackTrace(); } return null; }}

package com.sy.demo.util;import java.lang.reflect.Field;import com.sy.demo.annotation.Column;import com.sy.demo.annotation.Table;public class SqlUtil { private static final String EMPTY = ""; @SuppressWarnings("unchecked") public static String getSql(Object object) { StringBuilder sb = new StringBuilder(); ClassObject c; boolean isExist; Column column; String columnName; String getMethodName; Object columnValue; String[] strs; try { c = (ClassObject) object.getClass(); isExist = c.isAnnotationPresent(Table.class); if (!isExist) { return EMPTY; } Table table = c.getAnnotation(Table.class); sb.append(" SELECT * FROM " + table.value() + " WHERE 1 = 1 " ); Field[] fields = c.getDeclaredFields(); for (Field field: fields) { isExist = field.isAnnotationPresent(Column.class); if (!isExist) { continue; } column = field.getAnnotation(Column.class); columnName = column.value(); getMethodName = "get" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1); columnValue = c.getMethod(getMethodName, new Class[0]).invoke(object, new Object[0]); if (columnValue == null) { continue; } if (columnValue instanceof String) { columnValue = (String)columnValue; if(((String) columnValue).contains(",")) { sb.append("AND " + columnName + " IN ("); strs = ((String) columnValue).split(","); for(String str: strs) { sb.append("'" + str + "',"); } sb.deleteCharAt(sb.length() - 1); sb.append(") "); } else { sb.append("AND " + columnName + " = '" + columnValue + "' "); } } else if (columnValue instanceof Integer || columnValue instanceof Long) { sb.append("AND " + columnName + " = " + columnValue + " "); } } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); }}

如何实现自定义注解

首先,定义一个注解:

package com.guxiang.test;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

首先自定义一个 myTest注解

/**

 * @author guxiang

 * @date 2016年12月24日 下午10:22:11

 * 自定义的myTest注解

 */

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.METHOD,ElementType.ANNOTATION_TYPE})

public @interface MyTest {

    long time() default -1;

}

其次,写一个类用于被myTest注解,实现测试:

package com.guxiang.test;

public class SomeDaoImpl {

    public void save(){

        System.out.println("保存了数据");

    }

    public void update(){

        System.out.println("更新了数据");

    }

}

写一个测试类 这个类 引用myTest注解:

package com.guxiang.test;

public class SomeDaoImplTest {

    private SomeDaoImpl dao= new SomeDaoImpl();

    /**

     * 测试添加

     */

    @MyTest

    public void testAdd(){

        dao.save();

    }

    @MyTest

    public void testUpdate(){

        dao.update();

    }

最后,写一个myTestRunner类使用反射实现注解的功能:

package com.guxiang.test;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

// 反射注解

public class MyTestRunner {

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

        Class clazz = SomeDaoImplTest.class;

        Method[] ms = clazz.getMethods();

        for (Method method : ms) {

            boolean hasMyTest = method.isAnnotationPresent(MyTest.class);

            if (hasMyTest) {

                method.invoke(clazz.newInstance(), null);

            }

        }

    }

}

Java自定义注解

你的注解是定义在 com.bestTeam.ifu.annotation这个包下的

可是你引用的时候,怎么变成 com$annotation$ValidIdentitySign 这个了?确认你在使用的时候没有写错?

如何在java程序中添加注释

1、单行(single-line)--短注释://…… 单独行注释:在代码中单起一行注释, 注释前最好有一行空行,并与其后的代码具有一样的缩进层级。如果单行无法完成,则应采用块注释。 注释格式:/* 注释内容 */ 行头注释:在代码行的开头进行注释。主要为了使该行代码失去意义。 注释格式:// 注释内容 行尾注释:尾端(trailing)--极短的注释,在代码行的行尾进行注释。一般与代码行后空8(至少4)个格,所有注释必须对齐。 注释格式:代码 + 8(至少4)个空格 + // 注释内容

2、块(block)--块注释:/*……*/ 注释若干行,通常用于提供文件、方法、数据结构等的意义与用途的说明,或者算法的描述。一般位于一个文件或者一个方法的前面,起到引导的作用,也可以根据需要放在合适的位置。这种域注释不会出现在HTML报告中。注释格式通常写成: /* * 注释内容 */

3、文档注释:/**……*/ 注释若干行,并写入javadoc文档。每个文档注释都会被置于注释定界符 /**......*/ ...

关于java怎么自定义注释和自定义java注解的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-11-21,除非注明,否则均为首码项目网原创文章,转载请注明出处。