最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Java反射之實例構(gòu)造

2020-12-05 11:37 作者:無情劍客Burning  | 我要投稿

正常的反射實例化一個類很容易,但是當(dāng)涉及內(nèi)部類的情況就有點不一樣了。本文關(guān)于內(nèi)部類的語法是最核心的部分,更多內(nèi)容可參考語法書。 本文所有的異常都用Exception,不會區(qū)分何種異常。具體情況要根據(jù)實際情況。

Test001代碼

Test001.java代碼如下,在其中包含一個私有的內(nèi)部類,其構(gòu)造函數(shù)是帶有參數(shù)的。

package java_code;

public class Test001 {
? ?public Test001(){
? ? ? ?System.out.println("burning");
? ?}
? ?private class Test001001 {
? ? ? ?public Test001001(String str){
? ? ? ? ? ?System.out.println(str);
? ? ? ?}
? ?}

? ?public class Test001002 {
? ? ? ?public Test001002(){
? ? ? ? ? ?System.out.println("burning002");
? ? ? ?}
? ?}

? ?static class Test001003 {
? ? ? ?public Test001003(){
? ? ? ? ? ?System.out.println("burning003");
? ? ? ?}
? ?}

? ?private static class Test001004 {
? ? ? ?public Test001004(){
? ? ? ? ? ?System.out.println("burning004");
? ? ? ?}
? ?}
}

外部類實例化

公用類的反射實例化: 下面的代碼給出了兩種方式,不過第一種方式是Deprecated的。

? ? ? ?try{
? ? ? ? ? ?//Class.forName("java_code.Test001").newInstance();
? ? ? ? ? ?Test001.class.getDeclaredConstructor().newInstance();
? ? ? ?} catch (Exception e){
? ? ? ? ? ?e.printStackTrace();
? ? ? ?}

內(nèi)部類的實例化

內(nèi)部類的出現(xiàn)是簡化了Java那,還是把Java搞復(fù)雜了那。筆者更傾向于后者,可能也是我對Java的理解不夠。尤其是匿名內(nèi)部類和lambda表達(dá)式的出現(xiàn),雖然能夠在一定程度上減少代碼量,但是極大的增加了代碼的閱讀難度。

內(nèi)部類

內(nèi)部類分為如下三種:

1.靜態(tài)類2.非靜態(tài)類3.局部內(nèi)部類,具體可參考lambda表達(dá)式

內(nèi)部類的共有4個作用域: 同一個類、同一個包、父子類和任意位置。

靜態(tài)內(nèi)部類

靜態(tài)內(nèi)部類是外部類的類相關(guān)的,而不是外部類的對象相關(guān)的。靜態(tài)內(nèi)部類只是持有外部類的類引用,沒有持有外部類對象的引用,這也就是為什么靜態(tài)內(nèi)部類的實例方法不能外部類的實例屬性的原因。

非靜態(tài)內(nèi)部類

在非靜態(tài)內(nèi)部類的對象里,保存了一個它所寄生的外部類的對象引用,所以可以訪問外部類的私有成員。

反射

有了反射,Java的靈活性上升了一個層級,不過安全性就. . .

在運行狀態(tài)中,對于任意一個類,都能夠獲取到這個類的所有屬性和方法,對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性(包括私有的方法和屬性),這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能就稱為java語言的反射機制。通俗點講,通過反射,該類對我們來說是完全透明的,想要獲取任何東西都可以。

Android中的很多hook技術(shù),利用的就是反射+代理來實現(xiàn)的,后面的文章會專門寫Android的hook機制,包括Binder的HOOK。

API

沒有什么比官方文檔更權(quán)威的解釋,如果有,那就是源代碼了。相應(yīng)的API均來自官方文檔。

Modifier and TypeMethodDescriptionCommentClass<?>[]getDeclaredClasses()Returns an array of Class objects reflecting?all the classes and interfaces declared as members of the class?represented by this Class object.獲取到所有的類,包括內(nèi)部類和接口。ConstructorgetConstructor(Class<?>... parameterTypes)Returns a Constructor object that reflects the specified public constructor of the class represented by this Class object.如果是非靜態(tài)內(nèi)部類的話,第一個參數(shù)需要是其寄生的外部類Constructor<?>[]getConstructors()Returns an array containing constructor objects reflecting all the public constructors of the class represented by this Class object.當(dāng)實在搞不明白參數(shù)該怎么傳的時候,可以考慮把所有的構(gòu)造器都打印出來TnewInstance(Object... initargs)Uses the constructor represented by this Constructor object to create and initialize a new instance of the constructor's declaring class, with the specified initialization parameters.如果是非靜態(tài)內(nèi)部類的話,第一個參數(shù)需要是其寄生的外部類實例

實例化私有內(nèi)部類

Test.java代碼如下,關(guān)鍵地方給出了注釋。

package java_code;

import java.lang.reflect.Constructor;

public class Test {
? ?public static void main(String[] args) {
? ? ? ?Test001 test001 = new Test001();
? ? ? ?Object object = getInnerInstance(test001);
? ? ? ?try{
? ? ? ? ? ?Class.forName("java_code.Test001").newInstance();
? ? ? ? ? ?//Test001.class.getDeclaredConstructor().newInstance();
? ? ? ?} catch (Exception e){
? ? ? ? ? ?e.printStackTrace();
? ? ? ?}
? ?}

? ?private static Object getInnerInstance(Test001 test001) {
? ? ? ?Object object = null;
? ? ? ?try {
? ? ? ? ? ?Class[] innnerClass = test001.getClass().getDeclaredClasses();
? ? ? ? ? ?for (Class c: innnerClass){

? ? ? ? ? ? ? ?if (c.getName().indexOf("Test001001") != -1){//有參數(shù)
? ? ? ? ? ? ? ? ? ?//Constructor cc = c.getConstructors()[0];
? ? ? ? ? ? ? ? ? ?Constructor cc = c.getConstructor(test001.getClass(), String.class);
? ? ? ? ? ? ? ? ? ?object = cc.newInstance(test001, "歡迎關(guān)注我的微信公眾號:無情劍客");
? ? ? ? ? ? ? ?} else if (c.getName().indexOf("Test001002") != -1){//無參數(shù)
? ? ? ? ? ? ? ? ? ?Constructor cc = c.getConstructor(test001.getClass());
? ? ? ? ? ? ? ? ? ?object = cc.newInstance(test001);
? ? ? ? ? ? ? ?} else {//靜態(tài)內(nèi)部類
? ? ? ? ? ? ? ? ? ?Constructor cc = c.getConstructor();
? ? ? ? ? ? ? ? ? ?object = cc.newInstance();
? ? ? ? ? ? ? ?} ? ? ? ?
? ? ? ? ? ?}
? ? ? ? ? ?return object;
? ? ? ?} catch (Exception e) {
? ? ? ? ? ?e.printStackTrace();
? ? ? ? ? ?return null;
? ? ? ?}
? ?}
}

最終運行結(jié)果:

參考

https://docs.oracle.com/javase/9/javadoc/javadoc.html

寫在最后

網(wǎng)上很多寫反射的,但是對于內(nèi)部類的反射涉及的非常少,尤其是這種私有的內(nèi)部類。也許有人認(rèn)為私有內(nèi)部類是不能被外部實例化的,但是強大的反射功能突破了Java本身的一些規(guī)則。

公眾號

更多內(nèi)容,歡迎關(guān)注我的微信公眾號:無情劍客。


Java反射之實例構(gòu)造的評論 (共 條)

分享到微博請遵守國家法律
侯马市| 收藏| 广元市| 和静县| 永泰县| 鞍山市| 资兴市| 如皋市| 遵化市| 汉川市| 凯里市| 务川| 辉南县| 靖安县| 乾安县| 陆川县| 康乐县| 循化| 邹平县| 增城市| 旬邑县| 加查县| 延长县| 西盟| 墨脱县| 玛曲县| 莎车县| 都安| 昭苏县| 昌乐县| 亚东县| 陇南市| 合作市| 建德市| 远安县| 漳州市| 自治县| 无为县| 桂阳县| 额济纳旗| 正阳县|