中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

Java注解詳解

在使用SpringBoot作為Web敏捷開發的框架之后,SpringBoot除了自動裝配配置的便捷之外,在很多時候需要基于注解來開發。注解不僅增加了代碼的可讀性,還增加了開發的速度。這篇文章主要講述Java 注解。

創新互聯2013年開創至今,先為晉安等服務建站,晉安等地企業,進行企業商務咨詢服務。為晉安企業網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。

元注解

元注解用于注解其他注解的。Java 5.0定義了4個標準的元注解,如下:

@Target

@Retention

@Documented

Inherited

現在來說說這四個元注解有什么作用。

@Target

@Target注解用于聲明注解的作用范圍,例如作用范圍為類、接口、方法等。它的取值以及值所對應的范圍如下:

CONSTRUCTOR:用于描述構造器

FIELD:用于描述域

LOCAL_VARIABLE:用于描述局部變量

METHOD:用于描述方法

PACKAGE:用于描述包

PARAMETER:用于描述參數

TYPE:用于描述類、接口(包括注解類型) 或enum聲明

@Retention

該注解聲明了注解的生命周期,即注解在什么范圍內有效。

SOURCE:在源文件中有效

CLASS:在class文件中有效

RUNTIME:在運行時有效(即運行時保留)

大多數注解都為RUNTIME

@Documented

是一個標記注解,有該注解的注解會在生成 java 文檔中保留。

@Inherited

該注解表明子類是有繼承了父類的注解。比如一個注解被該元注解修飾,并且該注解的作用在父類上,那么子類有持有該注解。如果注解沒有被該元注解修飾,則子類不持有父類的注解。

自定義注解

在Java開發者,JDK自帶了一些注解,在第三方框架Spring 帶了大量的注解,這些注解稱為第三方注解。在很多實際開發過程中,我們需要定義自己的注解。那么現在以案例的方式來講解自定義注解。

在注解中,需要使用四種元注解來聲明注解的作用范圍、生命周期、繼承,是否生成文檔等。另外在注解中也可以有自己的成員變量,如果一個注解沒有成員變量則稱為標記注解。注解的成員變量,只支持原始類型、Class、Enumeration、Annoation。

現在定義一個@Writer注解,該注解被Retention、Documented、Inherited、Target修飾,表明該注解的作用范圍為類、接口和方法,生命周期為運行時、該注解生成文檔,并且子類可繼承該注解。該注解有2個成員變量,一個為name一個為 age,代碼如下:

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

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

public @interface Writer {

? ? String name();

? ? int age();

}

那么有了該注解,怎么用呢?

該注解的作用范圍為類、方法,寫一個WriterTest,代碼如下:

@Writer(name = "forezp", age = 12)

public class WriterTest {

? ? @Writer(name = "miya", age = 10)

? ? public void writeBlog() {

? ? ? ? System.out.println("writing blog");

? ? }

? ??

? }

?

該類有了這個注解有何用?

一般來說,用該類修飾的類,需要通過反射來做一下邏輯的開發的工作,可廣泛用于AOP、程序的配置等。現在寫一個方法通過反射來解析該注解:

? public static void main(String[] args) throws ClassNotFoundException {

? ? ? ? Class c = Class.forName("com.forezp.annotation.WriterTest");

? ? ? ? if (c.isAnnotationPresent(Writer.class)) {

? ? ? ? ? ? Writer w = (Writer) c.getAnnotation(Writer.class);

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

? ? ? ? }

? ? ? ? Method[] methods = c.getMethods();

? ? ? ? for (Method method : methods) {

? ? ? ? ? ? if (method.isAnnotationPresent(Writer.class)) {

? ? ? ? ? ? ? ? Writer w = method.getAnnotation(Writer.class);

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

? ? ? ? ? ? }

? ? ? ? }

? ? }

這些代碼基本為反射的內容,因為反射在另一篇文章已經詳細講述過,不再重復,運行該Main方法,控制臺打印出如下內容:

name:forezp age:12

name:miya age:10

案例實戰

有了上述的講解,你可能對注解有所了解,但是對注解的具體應用并不是很深刻。現在以一個案例來詳細講述。

大家都對ORM框架Mybitis都非常的熟悉,在這個框架中用了大量的注解。現在模仿這個框架,通過自定義注解,來解析sql 的查詢語句。實現過程大概如下:

定義@Table @Colum注解

定義一個實體User,定義一些基本的字段,并用注解修飾

用User類new對象,給對象的某些字段賦值

通過反射和注解來生成sql 的查詢語句

首先定義個一個Table注解,它的作用范圍為類,代碼如下:

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.TYPE)

@Documented

@Inherited

public @interface Table {

? ? String value() default "";

}

定義一個Column注解,作用范圍為字段,代碼如下:

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

public @interface Column {

? ? String value();

}

定義一個User類,在該類的加上@Table注解,在具體的字段上 @Column注解,代碼如下:

@Table("user")

public class User {

? ? @Column("id")

? ? private int id;

? ? @Column("name")

? ? private String name;

? ? @Column("age")

? ? private int age;

? ? @Column("address")

? ? private String address;

? ? ..//省略getter setter

? ?}

寫一個生成sql語句的類,它是通過反射來獲取表名、字段名,加上判斷實體對象的字段值來生成 查詢的 sql 語句的。代碼如下:

public class GenUserSql {

? ? public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {

? ? ? ? User u1 = new User();

? ? ? ? User u2 = new User();

? ? ? ? u1.setId(1);

? ? ? ? u2.setName("forezp");

? ? ? ? genSql(u2);

? ? ? ? genSql(u1);

? ? }

? ? private static void genSql(User user) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {

? ? ? ? Class c = user.getClass();

? ? ? ? StringBuilder stringBuilder = new StringBuilder();

? ? ? ? stringBuilder.append("select * from ");

? ? ? ? if (c.isAnnotationPresent(Table.class)) {

? ? ? ? ? ? Table table = (Table) c.getAnnotation(Table.class);

? ? ? ? ? ? String tableName = table.value();

? ? ? ? ? ? stringBuilder.append(tableName).append(" where 1=1 and ");

? ? ? ? }

? ? ? ? Field[] fields = c.getDeclaredFields();

? ? ? ? for (Field field : fields) {

? ? ? ? ? ? String columnName;

? ? ? ? ? ? if (field.isAnnotationPresent(Column.class)) {

? ? ? ? ? ? ? ? Column column = field.getAnnotation(Column.class);

? ? ? ? ? ? ? ? columnName = column.value();

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? continue;

? ? ? ? ? ? }

? ? ? ? ? ? String fieldName = field.getName();

? ? ? ? ? ? String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);

? ? ? ? ? ? ? ? ? ? ? ?Method method = c.getMethod(getMethodName);

? ? ? ? ? ? Object fieldValue = method.invoke(user);

? ? ? ? ? ? if (fieldValue == null || ((fieldValue instanceof Integer) && (Integer) fieldValue == 0)) {

? ? ? ? ? ? ? ? continue;

? ? ? ? ? ? }

? ? ? ? ? ? if (fieldValue instanceof Integer) {

? ? ? ? ? ? ? ? stringBuilder.append(columnName + "=" + fieldValue);

? ? ? ? ? ? }

? ? ? ? ? ? if (fieldValue instanceof String) {

? ? ? ? ? ? ? ? stringBuilder.append(columnName + "=" + "'" + fieldValue + "'");

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? System.out.println(stringBuilder.toString());

? ? }

}

運行程序,控制臺打印如下:

select * from user where 1=1 and name=‘forezp’

select * from user where 1=1 and id=1

當前文章:Java注解詳解
本文地址:http://www.2m8n56k.cn/article40/johjeo.html

成都網站建設公司_創新互聯,為您提供App開發網站內鏈定制網站全網營銷推廣虛擬主機商城網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都做網站
主站蜘蛛池模板: 99在线视频网站 | 99国产精品免费视频观看 | 国产精品久久一区二区三区 | 亚洲成人在线免费视频 | 一区二区三区日韩 | 久久精品国产一区二区 | a级毛片高清免费视频 | 精品国产91久久久久久久a | 二区三区在线 | 国产免费一级精品视频 | 国产成人高清一区二区私人 | 中日毛片| 日本一级高清片免费 | 国产精品久久久久国产精品三级 | avtt亚洲一区中文字幕 | 美国三级网站 | 夜鲁夜鲁夜鲁在线观看福利 | 国产成人免费高清视频网址 | 久久国产精品1区2区3区网页 | 亚洲综合色在线观看 | 91精品宅男在线观看 | 91精品国产免费久久国语蜜臀 | 日韩免费一级 | 欧美黄a | 亚洲欧美精选 | av毛片在线看 | 欧美午夜视频在线 | 日韩免费一级a毛片在线播放一级 | 免费人成在线观看网站品爱网 | 免费一级特黄a | 日韩午夜 | 国产成人一区二区三区在线播放 | 亚洲成a人片在线播放 | 欧美综合视频在线 | 亚洲精品视频网 | 国产亚洲欧美一区 | 欧美日产国产亚洲综合图区一 | 国产一区二区久久精品 | 91青青国产在线观看免费 | 国产vs久久 | 久久99亚洲精品久久久久 |