Class.forName(“全類名”):將字節(jié)碼文件加載進(jìn)內(nèi)存,返回Class對象
* 多用于配置文件,將類名定義在配置文件中。讀取文件,加載類
類名.class:通過類名的屬性class獲取
* 多用于參數(shù)的傳遞
對象.getClass():getClass()方法在Object類中定義著。
* 多用于對象的獲取字節(jié)碼的方式
結(jié)論:
同一個(gè)字節(jié)碼文件(*.class)在一次程序運(yùn)行過程中,只會被加載一次,不論通過哪一種方式獲取的Class對象都是同一個(gè)。
? * Field[] getFields() :獲取所有public修飾的成員變量
? * Field getField(String name) 獲取指定名稱的 public修飾的成員變量
? * Field[] getDeclaredFields() 獲取所有的成員變量,不考慮修飾符
? * Field getDeclaredField(String name)
? * Constructor<?>[] getConstructors()
? * Constructor getConstructor(類<?>… parameterTypes)
? * Constructor getDeclaredConstructor(類<?>… parameterTypes)
? * Constructor<?>[] getDeclaredConstructors()
? * Method[] getMethods()
? * Method getMethod(String name, 類<?>… parameterTypes)
? * Method[] getDeclaredMethods()
? * Method getDeclaredMethod(String name, 類<?>… parameterTypes)
? * String getName()
獲取該類的成員變量方法
- 批量的
- Field[] getFields():獲取所有的"公有字段"
- Field[] getDeclaredFields():獲取所有字段,包括:私有、受保護(hù)、默認(rèn)、公有;
- 獲取單個(gè)的:
public Field getField(String fieldName):獲取某個(gè)"公有的"字段;
public Field getDeclaredField(String fieldName):獲取某個(gè)字段(可以是私有的)
Constructor:構(gòu)造方法
獲取構(gòu)造方法們
* Constructor<?>[] getConstructors()
* Constructor getConstructor(類<?>… parameterTypes)
Constructor getDeclaredConstructor(類<?>… parameterTypes)
* Constructor<?>[] getDeclaredConstructors()
創(chuàng)建對象:
* T newInstance(Object… initargs)
? * 如果使用空參數(shù)構(gòu)造方法創(chuàng)建對象,操作可以簡化:Class對象的newInstance方法
? * Method[] getMethods()
? * Method getMethod(String name, 類<?>… parameterTypes)
? * Method[] getDeclaredMethods()
? * Method getDeclaredMethod(String name, 類<?>… parameterTypes)
?
jdk1.5之后新特性,說明程序的
作用分類:
①編寫文檔:通過代碼里標(biāo)識的注解生成文檔【生成文檔doc文檔】
②代碼分析:通過代碼里標(biāo)識的注解對代碼進(jìn)行分析【使用反射】
③編譯檢查:通過代碼里標(biāo)識的注解讓編譯器能夠?qū)崿F(xiàn)基本的編譯檢查【Override】
jdk中預(yù)定義的注解
? * @Override :檢測被該注解標(biāo)注的方法是否是繼承自父類(接口)的
? * @Deprecated:該注解標(biāo)注的內(nèi)容,表示已過時(shí)
? * @SuppressWarnings:壓制警告
? * 一般傳遞參數(shù)all @SuppressWarnings(“all”)
1.deprecation:使用了不贊成使用的類或方法時(shí)的警告(使用@Deprecated使得編譯器產(chǎn)生的警告);
2.unchecked:執(zhí)行了未檢查的轉(zhuǎn)換時(shí)的警告,例如當(dāng)使用集合時(shí)沒有用泛型 (Generics) 來指定集合保存的類型; 關(guān)閉編譯器警告
3.fallthrough:當(dāng) Switch 程序塊直接通往下一種情況而沒有 Break 時(shí)的警告;
4.path:在類路徑、源文件路徑等中有不存在的路徑時(shí)的警告;
5.serial:當(dāng)在可序列化的類上缺少 serialVersionUID 定義時(shí)的警告;
6.finally:任何 finally 子句不能正常完成時(shí)的警告;
7.all:關(guān)于以上所有情況的警告。
屬性:接口中的抽象方法
* 要求:
屬性的返回值類型有下列取值
* 基本數(shù)據(jù)類型
* String
* 枚舉
* 注解
* 以上類型的數(shù)組
定義了屬性,在使用時(shí)需要給屬性賦值
1. 如果定義屬性時(shí),使用default關(guān)鍵字給屬性默認(rèn)初始化值,則使用注解時(shí),可以不進(jìn)行屬性的賦值。 1. 如果只有一個(gè)屬性需要賦值,并且屬性的名稱是value,則value可以省略,直接定義值即可。 1. 數(shù)組賦值時(shí),值使用{}包裹。如果數(shù)組中只有一個(gè)值,則{}可以省略
元注解:用于描述注解的注解
* @Target:描述注解能夠作用的位置
* ElementType取值:
* TYPE:可以作用于類上
* METHOD:可以作用于方法上
* FIELD:可以作用于成員變量上
* @Retention:描述注解被保留的階段
* @Retention(RetentionPolicy.RUNTIME):當(dāng)前被描述的注解,會保留到class字節(jié)碼文件中,并被JVM讀取到
* @Documented:描述注解是否被抽取到api文檔中
* @Inherited:描述注解是否被子類繼承
? 元注解
? public @interface 注解名稱{
? 屬性列表;
? }
? * 本質(zhì):注解本質(zhì)上就是一個(gè)接口,該接口默認(rèn)繼承Annotation接口
? * public interface MyAnno extends java.lang.annotation.Annotation {}
1.@Retention: 定義注解的保留策略
@Retention(RetentionPolicy.SOURCE) //注解僅存在于源碼中,在class字節(jié)碼文件中不包含
@Retention(RetentionPolicy.CLASS) // 默認(rèn)的保留策略,注解會在class字節(jié)碼文件中存在,但運(yùn)行時(shí)無法獲得,
@Retention(RetentionPolicy.RUNTIME) // 注解會在class字節(jié)碼文件中存在,在運(yùn)行時(shí)可以通過反射獲取到
首 先要明確生命周期長度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。一般如果需要在運(yùn)行時(shí)去動態(tài)獲取注解信息,那只能用 RUNTIME 注解;如果要在編譯時(shí)進(jìn)行一些預(yù)處理操作,比如生成一些輔助代碼(如 ButterKnife),就用 CLASS注解;如果只是做一些檢查性的操作,比如 @Override 和 @SuppressWarnings,則可選用 SOURCE 注解。
2.@Target:定義注解的作用目標(biāo)
源碼為:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
@Target(ElementType.TYPE) //接口、類、枚舉、注解
@Target(ElementType.FIELD) //字段、枚舉的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法參數(shù)
@Target(ElementType.CONSTRUCTOR) //構(gòu)造函數(shù)
@Target(ElementType.LOCAL_VARIABLE)//局部變量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包
3.@Document:說明該注解將被包含在javadoc中
4.@Inherited:說明子類可以繼承父類中的該注解
在程序使用(解析)注解:獲取注解中定義的屬性值
? 1. 獲取注解定義的位置的對象 (Class,Method,Field)
? 2. 獲取指定的注解
? * getAnnotation(Class)
? //其實(shí)就是在內(nèi)存中生成了一個(gè)該注解接口的子類實(shí)現(xiàn)對象
? public class ProImpl implements Pro{
? public String className(){
return “cn.itcast.annotation.Demo1”;
? }
? public String methodName(){
? return “show”;
? }
? }
? 3. 調(diào)用注解中的抽象方法獲取配置的屬性值
來源:https://www.icode9.com/content-4-660301.html