一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java基礎之反射和泛型以及注解

java基礎之反射和泛型以及注解

2020-11-28 14:50Java教程網 Java教程

這篇文章主要介紹了 java基礎之反射和泛型以及注解的相關資料,需要的朋友可以參考下

 java基礎之反射泛型以及注解

泛型擦除

泛型擦除: 泛型只在編譯時期有效,編譯后的字節碼文件中不存在泛型信息。

聲明泛型集合,集合兩端類型必須一致。類型也可以用包裝類型,泛型的類型必須是引用類型,不能為基本類型。

實現公用的類和方法,對公用的業務進行抽取。

泛型方法/泛型類/泛型接口

?
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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本动漫黄网站在线观看 | gaychinese男男2022| 久久中文字幕乱码免费 | 久久永久影院免费 | 欧美日韩国产精品综合 | 亚洲 欧美 在线观看 | 小sao货水好多真紧h的视频 | 色在线看| 校花被拖到野外伦小说 | 手机看片日韩1024你懂的首页 | 国产综合色在线视频区色吧图片 | 欧美一区二区三区四区视频 | 国产亚洲精品aaa大片 | 久久综合狠狠综合久久综合88 | 色综合图片 | 亚洲伦理一区 | 青草午夜精品视频在线观看 | 四虎传媒 | 亚洲精品视频网 | 2018高清国产一道国产 | 王雨纯羞羞 | 操美女网址| 国产在线视频色综合 | 日韩在线视频一区二区三区 | 女人爽到喷水的视频免费 | 天堂激情网 | 麻豆网站在线免费观看 | 久久影院中文字幕 | 精品国产一二三区在线影院 | 丝瓜秋葵番茄绿巨人在线观看 | 亚洲高清一区二区三区久久 | 国产人成激情视频在线观看 | 狠狠草视频| 欧美国产影院 | 日韩毛片在线视频 | 欧美男人的天堂 | 人人爽人人香蕉 | 黑人巨茎大战欧美白妇 | 国产拍拍拍 | 深夜激情网站 | 动漫美女人物被黄漫在线看 |