您好,登錄后才能下訂單哦!
一文帶你了解java中的泛型、反射與注解?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
泛型擦除
泛型擦除: 泛型只在編譯時(shí)期有效,編譯后的字節(jié)碼文件中不存在泛型信息。
聲明泛型集合,集合兩端類型必須一致。類型也可以用包裝類型,泛型的類型必須是引用類型,不能為基本類型。
實(shí)現(xiàn)公用的類和方法,對(duì)公用的業(yè)務(wù)進(jìn)行抽取。
泛型方法/泛型類/泛型接口
public class GenericTest { /** * 泛型聲明,定義泛型方法 * @param <T> * @param <K> * @param t * @param k */ public <T, K> K save(T t, K k) { return null; } @Test public void testMethod() throws Exception { //使用泛型方法: 在使用泛型方法的時(shí)候,確定泛型的類型 save("hello", 1); } } 泛型類: public class GenericTest<T> @Test public void testMethod() throws Exception { //使用泛型方法: 在使用泛型方法的時(shí)候,確定泛型的類型 //save("hello", 1); //泛型類如何使用:在創(chuàng)建泛型類的時(shí)候確定 GenericTest<String> demo = new GenericTest<String>(); demo.save("hello", 1); }
泛型中的extends 和super的意義:
Extends:定義List<? Extends String>;傳入的參數(shù)?必須是String類型的子類,否則會(huì)報(bào)錯(cuò);
Super:定義List<? Super String>;傳入的參數(shù)必須是String類型的父類,否則會(huì)報(bào)錯(cuò);
Type : 接口,任何類型默認(rèn)的接口!
反射
反射可以在運(yùn)行時(shí)期動(dòng)態(tài)創(chuàng)建對(duì)象,獲取對(duì)象的屬性,方法
/** * @ClassName: App * @Description: 反射技術(shù) * @author lqw * @date 2016-5-13 下午01:33:55 * */ public class App { @Test public void testInfo() throws Exception { //類全名 String sql = "com.hbmy.reflect.demo2.Admin"; //得到類的字節(jié)碼 Class<?> clazz = Class.forName(sql); /** * 創(chuàng)建對(duì)象1: 通過(guò)默認(rèn)構(gòu)造函數(shù)創(chuàng)建(簡(jiǎn)寫(xiě)) */ Admin admin = (Admin) clazz.newInstance(); /** * 創(chuàng)建對(duì)象2: 通過(guò)無(wú)參構(gòu)造器創(chuàng)建對(duì)象 */ Constructor<?> constructors = clazz.getDeclaredConstructor(); constructors.newInstance(); /** * 創(chuàng)建對(duì)象3:通過(guò)有參構(gòu)造器創(chuàng)建對(duì)象 */ Constructor<?> constructor = clazz.getDeclaredConstructor(String.class); Admin admin2 = (Admin) constructor.newInstance("zhangsan"); // System.out.println(admin); } /** * 獲取屬性名稱、值 * getDeclaredFields: 獲取所有的包含私有的屬性名稱 * getFields:只能訪問(wèn)public的屬性 */ @Test public void testNameAndValue() throws Exception { //類全名 String sql = "com.hbmy.reflect.demo2.Admin"; //得到類的字節(jié)碼 Class<?> clazz = Class.forName(sql); Admin admin = (Admin) clazz.newInstance(); // Method[] methods = clazz.getMethods(); // for (Method method : methods) // { // //設(shè)置強(qiáng)制訪問(wèn) // method.setAccessible(true); // //名稱 // String name = method.getName(); // System.out.println(name); // // } // Field[] fields = clazz.getFields();//打印出來(lái)的結(jié)果只有money Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { //設(shè)置強(qiáng)制訪問(wèn) field.setAccessible(true); //名稱 String name = field.getName(); Object value = field.get(admin); System.out.println(name + value); } } /** * 反射獲取方法 */ @Test public void testGetMethods() throws Exception { //類全名 String sql = "com.hbmy.reflect.demo2.Admin"; //得到類的字節(jié)碼 Class<?> clazz = Class.forName(sql); Admin admin = (Admin) clazz.newInstance(); /* * 獲取方法對(duì)象 */ Method declaredMethod = clazz.getDeclaredMethod("getId"); /** * 調(diào)用方法 */ Object return_value = declaredMethod.invoke(admin); System.out.println(return_value); Method[] methods = clazz.getDeclaredMethods(); for (Method method : methods) { method.setAccessible(true); String name = method.getName(); System.out.println(name); } }
注解
注解的作用
1、 告訴編譯器如何去運(yùn)行
2、 簡(jiǎn)化(取代)配置文件
public class App { @Override public String toString() { return super.toString(); } @SuppressWarnings({"unused","unchecked"}) public void save() { List list = null; } @Deprecated public void save1() { } }
自定義注解: 通過(guò)自定義注解可以給類,字段,方法加上描述信息。
public @interface Author { /** * 注解屬性 * 1.修飾符為默認(rèn)或者public * 2.不能有主體 * 3. 如果注解名稱為value,使用的時(shí)候可以省略名稱,直接給值 */ String name() default "lqw"; //帶默認(rèn)值得注解 int age() default 23; String remark(); }
元注解
元注解就是注解的注解
指定注解的可用范圍 @Target({ TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) 注解的生命周期 /** * 元注解2: 指定注解的生命周期 * RetentionPolicy.SOURCE 只在源碼級(jí)別有效 * RetentionPolicy.CLASS 只在類的字節(jié)碼級(jí)別有效 默認(rèn)值 * RetentionPolicy.RUNTIME 只在運(yùn)行時(shí)期有效 */ @Retention(RetentionPolicy.SOURCE)
關(guān)于一文帶你了解java中的泛型、反射與注解問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。