泛型擦除
泛型擦除: 泛型只在編譯時期有效,編譯后的字節碼文件中不存在泛型信息。
聲明泛型集合,集合兩端類型必須一致。類型也可以用包裝類型,泛型的類型必須是引用類型,不能為基本類型。
實現公用的類和方法,對公用的業務進行抽取。
泛型方法/泛型類/泛型接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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 { //使用泛型方法: 在使用泛型方法的時候,確定泛型的類型 save( "hello" , 1 ); } } 泛型類: public class GenericTest<T> @Test public void testMethod() throws Exception { //使用泛型方法: 在使用泛型方法的時候,確定泛型的類型 //save("hello", 1); //泛型類如何使用:在創建泛型類的時候確定 GenericTest<String> demo = new GenericTest<String>(); demo.save( "hello" , 1 ); } |
泛型中的extends 和super的意義:
Extends:定義List<? Extends String>;傳入的參數?必須是String類型的子類,否則會報錯;
Super:定義List<? Super String>;傳入的參數必須是String類型的父類,否則會報錯;
Type : 接口,任何類型默認的接口!
反射
反射可以在運行時期動態創建對象,獲取對象的屬性,方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
/** * @ClassName: App * @Description: 反射技術 * @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" ; //得到類的字節碼 Class<?> clazz = Class.forName(sql); /** * 創建對象1: 通過默認構造函數創建(簡寫) */ Admin admin = (Admin) clazz.newInstance(); /** * 創建對象2: 通過無參構造器創建對象 */ Constructor<?> constructors = clazz.getDeclaredConstructor(); constructors.newInstance(); /** * 創建對象3:通過有參構造器創建對象 */ Constructor<?> constructor = clazz.getDeclaredConstructor(String. class ); Admin admin2 = (Admin) constructor.newInstance( "zhangsan" ); // System.out.println(admin); } /** * 獲取屬性名稱、值 * getDeclaredFields: 獲取所有的包含私有的屬性名稱 * getFields:只能訪問public的屬性 */ @Test public void testNameAndValue() throws Exception { //類全名 String sql = "com.hbmy.reflect.demo2.Admin" ; //得到類的字節碼 Class<?> clazz = Class.forName(sql); Admin admin = (Admin) clazz.newInstance(); // Method[] methods = clazz.getMethods(); // for (Method method : methods) // { // //設置強制訪問 // method.setAccessible(true); // //名稱 // String name = method.getName(); // System.out.println(name); // // } // Field[] fields = clazz.getFields();//打印出來的結果只有money Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { //設置強制訪問 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" ; //得到類的字節碼 Class<?> clazz = Class.forName(sql); Admin admin = (Admin) clazz.newInstance(); /* * 獲取方法對象 */ Method declaredMethod = clazz.getDeclaredMethod("getId"); /** * 調用方法 */ 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、 告訴編譯器如何去運行
2、 簡化(取代)配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public class App { @Override public String toString() { return super .toString(); } @SuppressWarnings ({ "unused" , "unchecked" }) public void save() { List list = null ; } @Deprecated public void save1() { } } |
自定義注解: 通過自定義注解可以給類,字段,方法加上描述信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public @interface Author { /** * 注解屬性 * 1.修飾符為默認或者public * 2.不能有主體 * 3. 如果注解名稱為value,使用的時候可以省略名稱,直接給值 */ String name() default "lqw" ; //帶默認值得注解 int age() default 23 ; String remark(); } |
元注解
元注解就是注解的注解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
指定注解的可用范圍 @Target ({ TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) 注解的生命周期 /** * 元注解2: 指定注解的生命周期 * RetentionPolicy.SOURCE 只在源碼級別有效 * RetentionPolicy.CLASS 只在類的字節碼級別有效 默認值 * RetentionPolicy.RUNTIME 只在運行時期有效 */ @Retention (RetentionPolicy.SOURCE) |
最后總結一句:注解和反射其實不難,只要不畏懼,注解其實看看源碼也就那么回事。至于反射嘛。可以這么說,無反射,則無框架,幾乎所有的框架都是通過反射實現的。說白了,反射也就是通過加載類的字節碼去獲取類里面的方法和屬性,其實框架也是這么實現的。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/lqw_student/article/details/51415307