java註解——實現原理
Java語言中的類、方法、變數、引數和包等都可以被標註。和Javadoc不同,Java標註可以通過反射獲取標註內容。在編譯器生成類檔案時,標註可以被嵌入到位元組碼中。Java虛擬機器可以保留標註內容,在執行時可以獲取到標註內容。 當然它也支援自定義Java標註。
內建註解
- Override - 檢查該方法是否是過載方法。如果發現其父類,或者是引用的介面中並沒有該方法時,會報編譯錯誤。
- Deprecated - 標記過時方法。如果使用該方法,會報編譯警告。
- SuppressWarnings - 指示編譯器去忽略註解中宣告的警告。
當然啦,我們主要的目的是學習自定義註解
下面給出一個例子,主要是關於我們在連線資料庫的自定義註解
package com.annotion;
import java.lang.annotation.*;
/**
* @Target代表註解可以使用的地方
* ElementType代表元素型別,它是一個列舉
* FIELD代表可以用在例項域上。
*
* @Retention 其中的RetentionPolicy表示保留策略,它也是一個列舉型別,包含三種策略,(預設是CLASS)
* ①SOURCE 表示 註解將被編譯器丟棄(也就是隻能在原始碼中存在,編譯成class檔案後,就沒了) (例如我們常用的@Override)
* ②CLASS 表示 註解將在被編譯器在類檔案中記錄,但在執行時不需要被虛擬機器保留.
* (在編譯成.class檔案後依然存在,但是在虛擬機器中執行的時候就沒有了)
* ③RUNTIME 表示註解將由編譯器在類檔案中記錄,在執行時由虛擬機器保留,因此它們可以反射性的讀取。
* (在虛擬機器中執行的時候任然存在,但是程式可以通過反射獲取這些資訊。)
*
* @Inherited 表示這個註解可以被子類繼承
*
* @Document表示當執行javadoc的時候,本註解會生成相關文件
*/
@Target({ElementType.METHOD,ElementType.TYPE,ElementType.FIELD,ElementType.PARAMETER,ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface JDBCConfig {
String ip();
int port() default 3306;
String database();
String encoding();
String loginName();
String password();
}
接著通過反射連線我們的資料庫
*package com.annotion;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* @author home-pc
* @create2018 -03 -31 -10:32
*/
@JDBCConfig(ip=”127.0.0.1”,database = “test”,encoding = “UTF-8”,loginName = “root”,password = “admin”)
public class TestAnnotation {
static {
try {
Class.forName(“com.mysql.jdbc.Driver”);
}catch (ClassNotFoundException e){
e.printStackTrace();
}
}
/**
* 通過反射
* @return
* @throws SQLException
* @throws NoSuchFieldException
* @throws SecurityException
*/
public static Connection getConnection()throws SQLException,NoSuchFieldException,SecurityException{
JDBCConfig config = TestAnnotation.class.getAnnotation(JDBCConfig.class);
String ip = config.ip();
int port = config.port();
String database = config.database();
String encoding = config.encoding();
String loginName = config.loginName();
String password = config.password();
String url = String.format("jdbc:mysql://%s:%d/%s?characterEncoding=%s", ip, port, database, encoding);
return DriverManager.getConnection(url,loginName,password);
}
public static void main(String[] args)throws NoSuchFieldException,SecurityException,SQLException, NoSuchMethodException {
Connection connection=getConnection();
System.out.println(connection);
}
}
*
總結:註解很重要的一點是通過註解把我們註解的內容保留在位元組碼檔案中或者執行的虛擬機器中,以便在執行時獲得標註的內容。
相關推薦
java註解——實現原理
Java語言中的類、方法、變數、引數和包等都可以被標註。和Javadoc不同,Java標註可以通過反射獲取標註內容。在編譯器生成類檔案時,標註可以被嵌入到位元組碼中。Java虛擬機器可以保留標註內容,在執行時可以獲取到標註內容。 當然它也支援自定義Java
Java 註解(原理及其使用)
def ava IT 使用範圍 自動化測試 決定 加載 del 特定 一、註解(annotation)介紹 Java在JDK5中引入源代碼的註解機制。 1、什麽是註解? 註解為代碼添加了元數據,元數據是關於數據的組織、數據域及其關系的說明信息。 更通俗的
java JNI 實現原理 (二) Linux 下如何 load JNILibrary
unlock this error clear jvm 動態鏈接 dlink 參考 保護 在博客java JNI (一)虛擬機中classloader的JNILibrary 中討論了java中的Library 是由classloader 來load的,那我們來看看 clas
java註解實現代理
inter vat parse system urn lan run ppr eth 使用註解來實現代理。主要使用三個自定義的類。如下。 一,枚舉類,有前後兩種。 1 package cn.jxlys.util; 2 3 /** 4 * 代理的類型,前還是後
Spring註解實現原理
先來說說註解是什麼: 註解顧名思義,就是類似於添加註釋,但是又不跟註釋完全一樣,因此,我們可以將它理解為將類或者方法與特定的資訊進行關聯。 那麼註解如何實現? 1、介面使用@interface定義。 2、通過繼承以下註解,實現功能: 元註解@Target,@Ret
java HASHMAP 實現原理
1. HashMap概述: HashMap是基於雜湊表的Map介面的非同步實現(Hashtable跟HashMap很像,唯一的區別是Hashtalbe中的方法是執行緒安全的,也就是同步的)。此實現提供所有可選的對映操作,並允許使用null值和null鍵。此類不保證對
java HashSet實現原理
1. HashSet概述: HashSet實現Set介面,由雜湊表(實際上是一個HashMap例項)支援。它不保證set 的迭代順序;特別是它不保證該順序恆久不變。此類允許使用null元素。2. HashSet的實現: 對於HashSet而言,它是基於Ha
SpringBoot事務註解實現原理
首先定義註解 @Retention(RetentionPolicy.RUNTIME)//讓註解保留到執行時期 @Target(ElementType.METHOD)//標誌這個註解是對方法的註解
使用Spring AOP結合自定義Java註解實現動態資料來源設定
1、定義Java註解 @Retention(RetentionPolicy.RUNTIME) // 註解將要寫到型別(Class/Interface)還是其它元素(Method等)上,支援package、type、method、field等,一般只會配置一個@Target
Java註解實現增刪改查CRUD
以前,我們都把對資料庫的增刪改查語句寫在xml檔案中(詳見:《程式設計師成長筆記(一)》第三部分,第四章,第四節)。 由於Java註解的簡潔高效,在Java註解的思想(幹掉xml)下,現在越來越多的人使用java註解來進行增刪改查操作。 而且MyBatis3也支援並鼓勵我
Java HashMap實現原理2——HashMap詳解
博主的前兩篇文章Java HashMap實現原理0——從hashCode,equals說起,Java HashMap實現原理1——散列表已經講述了HashMap設計的知識點,包括:hashCode(),equals(),散列表結構,雜湊函式、衝突解決等,在散列表
JAVA synchronized實現原理以及其中鎖優化的歸納總結
在java中存在兩種鎖機制,分別是synchronized和Lock。Lock介面和實現類是JDK5新增的內容,而synchronized在JDK6開始提供了一系列的鎖優化,下面總結一下synchronized的實現原理和涉及的一些鎖優化機制 1.sync
Spring-AOP基於JAVA註解實現
1.選擇切面切點或者連線點 定義一個需要切面的介面 //Spring-AOP程式設計是基於方法的切面程式設計,及只能在方法前後進行切面程式設計 //現在就對下面這個介面中的方法進行切面程式設計 public interface Performance{
Android主流IOC框架淺析(Java註解反射原理)
TextView mTextView; mTextView=(TextView) findViewById(R.id.mTextView); mTextView.setOnClickListener(new OnClickListener() { @Override public void onClick
JAVA CAS實現原理與使用
在JDK 5之前Java語言是靠synchronized關鍵字保證同步的,這會導致有鎖(後面的章節還會談到鎖)。鎖機制存在以下問題:(1)在多執行緒競爭下,加鎖、釋放鎖會導致比較多的上下文切換和排程延時,引起效能問題。(2)一個執行緒持有鎖會導致其它所有需要此鎖的執行緒掛起。
Java註解及通過自定義Java註解實現資料庫的操作
在Java程式中通過註解,可以讓程式設計更加簡潔、程式碼更加清晰。因此在Java框架程式碼中,嵌入了大量的註解。 講註解,首先得講註解的概念:Java提供了一種原程式中的元素關聯任何資訊和任何元資料的途徑和方法。 一、註解的分類 1、按照執行機制分為原始碼註解、編譯註解和執
Spring Boot中@ConfigurationProperties註解實現原理原始碼解析
0. 開源專案推薦 Pepper Metrics是我與同事開發的一個開源工具(https://github.com/zrbcool/pepper-metrics),其通過收集jedis/mybatis/httpservlet/dubbo/motan的執行效能統計,並暴露成prometheus等主流時序資料庫相
Spring 原始碼(九)@Autowired註解實現原理(Spring Bean的自動裝配)
AutowiredAnnotationBeanPostProcessor 類圖 PriorityOrdered:確認 AutowiredAnnotationBeanPostProcessor 後置處理器的執行優先順序 BeanFactoryAware:使得AutowiredAnnotationBeanP
管程(Monitor)概念及Java的實現原理
### 互斥 互斥訪問是併發程式設計要解決的核心問題之一。 有許多種方法可以滿足臨界區的互斥訪問。大體上可以分為三種, 一種是軟體方法,即由使用者程式承擔互斥訪問的責任,而不需要依賴程式語言或作業系統,譬如Dekker演算法、Peterson演算法等,通常這種方式會有一定的效能開銷和程式設計難度。 第二種是作