Java注釈のあれらの事
26863 ワード
注釈(メタデータとも呼ばれる)は、コードに情報を追加するための形式的な方法を提供し、後でこれらのデータを容易に使用することができます.たとえば、記述子の性質のクラスやインタフェースを作成するときに、重複作業が含まれると、注釈を使用してプロセスを簡素化し、自動化することを考慮することができます.
注記の出現はjdk 1である.5に導入された注釈の使用はjava反射の使用を伴うことが多い.次にjdkに組み込まれている3つの標準注釈と4つのメタ注釈について説明します.
3つの標準注記はlangパッケージの下に定義され、それぞれ:@Override,@Deprecated,@SuppressWarningである.
4つのメタ注記:それぞれ@Target,@Retention,@Documented,@Inheritedである.
次にコードを説明します.注記@interfaceを定義します.注記の注記要素の使用可能なタイプは次のとおりです.すべての基本データ型 String Class enum Annotation 以上のタイプの配列形式
Description注記を定義し、class、methodレベルでのみ使用します.VMの実行時に注記は破棄されず、javaDocに含まれ、子クラスが親クラスを継承できるようにします.
注記クラスには、Stringタイプ、intタイプ、Stringタイプの3つの変数が定義されており、注記の値を解析する際に、反射メカニズムを使用してクラス情報をロードします.isAnnotationPresent()メソッドを使用して、クラス、メソッドにカスタム注釈が存在するかどうかを判断し、class、methodレベルでgetAnnotation()を使用して指定した注釈の情報を取得し、値を取得します.
次に、sql文を印刷する小さな機能を実装します.注釈実装を使用します.まず、2つの注釈@Tableを定義してテーブル名(データベース・テーブル名と一致する)を指定し、@Colunmはフィールド名を指定します.
ユーザーテーブルでカスタム注釈を使用しようとしました
テストコード:
簡単な説明をするだけで、具体的な複雑な論理には大量のsql文の適合が必要です.
注記の出現はjdk 1である.5に導入された注釈の使用はjava反射の使用を伴うことが多い.次にjdkに組み込まれている3つの標準注釈と4つのメタ注釈について説明します.
3つの標準注記はlangパッケージの下に定義され、それぞれ:@Override,@Deprecated,@SuppressWarningである.
@Override: 。
@Deprecated: 。
@SuppressWarning: 。
4つのメタ注記:それぞれ@Target,@Retention,@Documented,@Inheritedである.
@Target: 。 ElementType :
1.Constructor: 。
2.Field: ( enum )。
3.Local_Variable: 。
4.Method: 。
5.Package: 。
6.Parameter: 。
7.Type: , ( ) enum 。
@Retention: 。 RetentionPolicy :
1.Source: 。
2.Class: class , VM 。
3.Runtime:VM , 。
@Documented: JavaDoc 。
@Inherited: ( , , , )
次にコードを説明します.注記@interfaceを定義します.注記の注記要素の使用可能なタイプは次のとおりです.
package com.example.bootDemo.Anno;
import java.lang.annotation.*;
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Description {
// , String value();
//String value();
String name();
int age();
String address() default "xxxx"; // , xxxx
}
package com.example.bootDemo.Anno;
@Description(name = "parent_className",age = 18,address = "PPPP")
public class Parent {
@Description(name = "parent",address = "ppp",age = 50)
public void say(){
}
}
package com.example.bootDemo.Anno;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args){
try {
Class> clazz = Class.forName("com.example.bootDemo.Anno.Parent");
//
boolean exist = clazz.isAnnotationPresent(Description.class);
if(!exist){
return;
}
Description classAnno = clazz.getAnnotation(Description.class);
System.out.println(classAnno.name()+" "+classAnno.age()+" "+classAnno.address());
//
Method[] methods = clazz.getMethods();
if(null == methods){
return;
}
for (Method m: methods) {
boolean b = m.isAnnotationPresent(Description.class);
if(!b){
return;
}
Description methodAnno = m.getAnnotation(Description.class);
System.out.println(methodAnno.name()+" "+methodAnno.age()+" "+methodAnno.address());
}
}catch (Exception e){
e.printStackTrace();
}
}
}
Description注記を定義し、class、methodレベルでのみ使用します.VMの実行時に注記は破棄されず、javaDocに含まれ、子クラスが親クラスを継承できるようにします.
注記クラスには、Stringタイプ、intタイプ、Stringタイプの3つの変数が定義されており、注記の値を解析する際に、反射メカニズムを使用してクラス情報をロードします.isAnnotationPresent()メソッドを使用して、クラス、メソッドにカスタム注釈が存在するかどうかを判断し、class、methodレベルでgetAnnotation()を使用して指定した注釈の情報を取得し、値を取得します.
次に、sql文を印刷する小さな機能を実装します.注釈実装を使用します.まず、2つの注釈@Tableを定義してテーブル名(データベース・テーブル名と一致する)を指定し、@Colunmはフィールド名を指定します.
package com.example.bootDemo.Anno;
import java.lang.annotation.*;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Table {
String value();
}
package com.example.bootDemo.Anno;
import java.lang.annotation.*;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Column {
String value();
}
ユーザーテーブルでカスタム注釈を使用しようとしました
package com.example.bootDemo.Anno;
@Table("user")
public class User {
@Column("id")
private Integer id;
@Column("name")
private String name;
@Column("email")
private String email;
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 String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
テストコード:
package com.example.bootDemo.Anno;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestSql {
// , , sql
public static void main(String[] args) throws Exception{
User user = new User();
user.setId(2);
String sql1 = querySql(user);
System.out.println(sql1);
user.setName(" ");
String sql2 = querySql(user);
System.out.println(sql2);
user.setEmail("[email protected];[email protected]");
String sql3 = querySql(user);
System.out.println(sql3);
}
static String querySql(Object obj) throws Exception{
StringBuffer sb=new StringBuffer();
//
Class<?> clazz = obj.getClass();
// @Table
boolean isTable = clazz.isAnnotationPresent(Table.class);
if(!isTable){
return null;
}
Table table = clazz.getAnnotation(Table.class);
//
String tableName = table.value();
// sql
sb.append("select * from ").append(tableName).append(" where 1=1 ");
//------
//
Field[] fields = clazz.getDeclaredFields();
for (Field field: fields) {
boolean isColumn = field.isAnnotationPresent(Column.class);
if(!isColumn){
continue;
}
Column fieldAnnotation = field.getAnnotation(Column.class);
//
String fieldName = fieldAnnotation.value();
// get , invoke
String methodToGetValue="get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1,fieldName.length());
Method method = clazz.getMethod(methodToGetValue);
Object fieldValue = method.invoke(obj);
if(null == fieldValue){
continue;
}
sb.append(" and ");
if(fieldValue instanceof String ){
if(((String) fieldValue).contains(";")){
sb.append(fieldName+" in ("+((String) fieldValue).replaceAll(";",",")+")");
}else {
sb.append(fieldName+"= " + fieldValue);
}
}
if(fieldValue instanceof Integer){
sb.append(fieldName+"= "+fieldValue);
}
}
return sb.toString();
}
}
select * from user where 1=1 and id= 2
select * from user where 1=1 and id= 2 and name=
select * from user where 1=1 and id= 2 and name= and email in (1339148474@qq.com,572212558@qq.com)
簡単な説明をするだけで、具体的な複雑な論理には大量のsql文の適合が必要です.