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

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

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

服務器之家 - 編程語言 - Java教程 - Java 反射機制的實例詳解

Java 反射機制的實例詳解

2021-01-18 10:07子沐阿 Java教程

這篇文章主要介紹了Java 反射機制的實例詳解的相關資料,希望通過本文能幫助到大家,讓大家理解掌握反射機制,需要的朋友可以參考下

Java 反射機制的實例詳解

前言

今天介紹下Java的反射機制,以前我們獲取一個類的實例都是使用new一個實例出來。那樣太low了,今天跟我一起來學習學習一種更加高大上的方式來實現。

正文

Java反射機制定義

Java反射機制是指在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。 用一句話總結就是反射可以實現在運行時可以知道任意一個類的屬性和方法。

反射機制的優點與缺點

為什么要用反射機制?直接創建對象不就可以了嗎,這就涉及到了動態與靜態的概念

靜態編譯:在編譯時確定類型,綁定對象,即通過。

動態編譯:運行時確定類型,綁定對象。動態編譯最大限度發揮了java的靈活性,體現了多態的應用,有以降低類之間的藕合性。

優點

可以實現動態創建對象和編譯,體現出很大的靈活性,特別是在J2EE的開發中它的靈活性就表現的十分明顯。比如,一個大型的軟件,不可能一次就把把它設計的很完美,當這個程序編譯后,發布了,當發現需要更新某些功能時,我們不可能要用戶把以前的卸載,再重新安裝新的版本,假如這樣的話,這個軟件肯定是沒有多少人用的。采用靜態的話,需要把整個程序重新編譯一次才可以實現功能的更新,而采用反射機制的話,它就可以不用卸載,只需要在運行時才動態的創建和編譯,就可以實現該功能。

缺點

對性能有影響。使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什么并且它滿足我們的要求。這類操作總是慢于只直接執行相同的操作。

理解Class類和類類型

想要了解反射首先理解一下Class類,它是反射實現的基礎。

類是java.lang.Class類的實例對象,而Class是所有類的類(There is a class named Class) 對于普通的對象,我們一般都會這樣創建和表示:

?
1
Code code1 = new Code();

上面說了,所有的類都是Class的對象,那么如何表示呢,可不可以通過如下方式呢:

?
1
Class c = new Class();

但是我們查看Class的源碼時,是這樣寫的:

?
1
2
3
private Class(ClassLoader loader) {
classLoader = loader;
}

可以看到構造器是私有的,只有JVM可以創建Class的對象,因此不可以像普通類一樣new一個Class對象,雖然我們不能new一個Class對象,但是卻可以通過已有的類得到一個Class對象,共有三種方式,如下:

?
1
Class c1 = Code.class;

這說明任何一個類都有一個隱含的靜態成員變量class,這種方式是通過獲取類的靜態成員變量class得到的

?
1
Class c2 = code1.getClass();

code1是Code的一個對象,這種方式是通過一個類的對象的getClass()方法獲得的

?
1
Class c3 = Class.forName(“com.trigl.reflect.Code”);

這種方法是Class類調用forName方法,通過一個類的全量限定名獲得 ,這里,c1、c2、c3都是Class的對象,他們是完全一樣的,而且有個學名,叫做Code的類類型(class type)。 這里就讓人奇怪了,前面不是說Code是Class的對象嗎,而c1、c2、c3也是Class的對象,那么Code和c1、c2、c3不就一樣了嗎?為什么還叫Code什么類類型?這里不要糾結于它們是否相同,只要理解類類型是干什么的就好了,顧名思義,類類型就是類的類型,也就是描述一個類是什么,都有哪些東西,所以我們可以通過類類型知道一個類的屬性和方法,并且可以調用一個類的屬性和方法,這就是反射的基礎。

舉個簡單例子代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
//第一種:Class c1 = Code.class;
Class class1=ReflectDemo.class;
System.out.println(class1.getName());
 
  //第二種:Class c2 = code1.getClass();
  ReflectDemo demo2= new ReflectDemo();
  Class c2 = demo2.getClass();
  System.out.println(c2.getName());
 
  //第三種:Class c3 = Class.forName("com.trigl.reflect.Code");
  Class class3 = Class.forName("com.tengj.reflect.ReflectDemo");
  System.out.println(class3.getName());
}
}

執行結果:

?
1
2
3
com.tengj.reflect.ReflectDemo
com.tengj.reflect.ReflectDemo
com.tengj.reflect.ReflectDemo

Java反射相關操作

前面我們知道了怎么獲取Class,那么我們可以通過這個Class干什么呢?

總結如下:

獲取成員方法Method
獲取成員變量Field
獲取構造函數Constructor

下面來具體介紹

獲取成員方法信息

單獨獲取某一個方法是通過Class類的以下方法獲得的:

?
1
2
3
public Method getDeclaredMethod(String name, Class c){
 
}

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://geek.csdn.net/news/detail/239924

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美亚洲高清日韩成人 | 欧美成人福利 | 农村妇女野外牲交一级毛片 | 特级一级全黄毛片免费 | 久久视频这有精品63在线国产 | 91制片厂 果冻传媒 天美传媒 | 超级乱淫伦短篇在车上 | 91东航翘臀女神在线播放 | 99视频精品国在线视频艾草 | 国产成年人网站 | 9re视频这里只有精品 | 日本破处 | 亚洲高清国产拍精品动图 | 成人精品mv视频在线观看 | 关晓彤一级做a爰片性色毛片 | 男插女的下面免费视频夜色 | 欧美午夜精品久久久久久黑人 | 精品久久久久久国产91 | 国产精品视频在线观看 | 亚洲va久久久久 | 日韩国产欧美一区二区三区 | 亚洲狠狠综合久久 | 国产午夜精品福利久久 | 男女男精品视频免费观看 | 无码乱人伦一区二区亚洲 | 5x社区在线观看直接进入 | 日本黄色录像视频 | 欧美高清免费一级在线 | 欧美成人福利 | 奇米小说| 福利视频一区二区三区 | 99久久免费精品视频 | 美女被躁爽死 | 免费视频片在线观看 | 西野翔全部作品在线观看 | 亚洲大片在线观看 | 日韩亚洲欧美一区二区三区 | 亚洲区在线播放 | 纲手被漫画aⅴ | 色综合久久天天综合观看 | 国内视频一区二区三区 |