「java怎么自定义注释」自定义java注解
今天给各位分享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
如何创建,使用以及解析自定义注解
首先要想使用自定义注解,必须创建自己的注解类
右键项目,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注解的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-11-21,除非注明,否则均为
原创文章,转载请注明出处。