日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java动态变量名反射_Java动态性—反射 - Eclipse666的个人空间 - OSCHINA - 中文开源技术交流社区...

發(fā)布時間:2023/12/2 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java动态变量名反射_Java动态性—反射 - Eclipse666的个人空间 - OSCHINA - 中文开源技术交流社区... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.什么是動態(tài)語言?

程序運行時,可以改變程序的結(jié)構(gòu)或者變量類型;如Python,javaScript

function(){

var s="var a=3;var b=4;" evals(s);

}

在執(zhí)行javascript代碼的的過程中,可以改變變量的值或插入語句改變結(jié)構(gòu)。

但Java,c 并不是動態(tài)的語言

不過我們可以利用反射的機制,字節(jié)碼的操作等獲得動態(tài)語言的特性,使得Java的編程更加靈活。

2.反射(reflection)

----程序已經(jīng)運行,但依然可以加載,探知使用編譯期間完全未知的類

----在程序運行的時候,可以只根據(jù)類的名稱,來動態(tài)加載一個類。

對于任意一個已經(jīng)加載的類,我們都能知道它的所有屬性和方法,對于任意一個對象,我們都能調(diào)用它的方法和屬性。

----Class? clz? = Class.forName("包名.類名“)

-----加載完類之后,會在堆的內(nèi)存中產(chǎn)生一個Class類型的對象(一個類只有一個Class對象),這個對象包含了類的完整的結(jié)構(gòu)信息,通過這個對象,

我們可以看到類的結(jié)構(gòu)信息,它就像一面鏡子,所以稱之為反射。

2.簡單的實例

通過反射。User類的結(jié)構(gòu)信息就會被保存到clz對象中。

另外獲取Class對象的方法

1.類名.class()? 如(int.class? User.class)

2.對象名.getClass()

3.反射的作用

--動態(tài)加載類,獲取類的(屬性,方法)

Class? clz? = Class.forName("包名.類名“)

--動態(tài)構(gòu)造對象

User u = clz.getDeclaredsConstructor (?"形參類型.class"....).newInstance();

--動態(tài)調(diào)用類的任意方法,構(gòu)造器

Methods []arr = clz.getDeclaredtMethods()(獲得所有方法)

Methods method = clz.getDeclaredMethods("方法名", "方法的形參類型.class")

Constructor [] arr = clz.getDeclaredConstructors()(獲得所有的構(gòu)造器)

Constructor constructor = clz.getDeclaredsConstructor (?"形參類型.class"....)

--動態(tài)調(diào)用處理屬性

Fileds[] array = clz.getFields();(只能獲得Publicb屬性的變量)

Fileds[] array =? clz.getDeclaredFields()(獲得所有屬性)

Filed? field =? clz.getDeclaredFields("指定名稱的屬性")

--動態(tài)獲取泛型信息

--處理注解

4.實例

package com.ljl.reflection;

import java.lang.reflect.Method;

public class ReflectionTest1 {

public static void main(String[] args) throws Exception {

// TODO Auto-generated method stub

Class clz = Class.forName("com.ljl.reflection.User");

System.out.println(clz);

//通過反射構(gòu)造對象

User u1 = (User) clz.getConstructor().newInstance();

System.out.println(u1);

//通反射API調(diào)用普通方法

Method method1 = clz.getDeclaredMethod("setId", int.class);

method1.invoke(u1, 001);

Method method2 = clz.getDeclaredMethod("setName", String.class);

method2.invoke(u1, "panda");

//u1.setId(001);u1.setName("panda");相同

System.out.println(u1);

//通過反射Api操作屬性

java.lang.reflect.Field f = clz.getDeclaredField("id");

//若屬性私有,不能操作,將會報錯。

//設(shè)置:不做安全檢查

f.setAccessible(true);

f.set(u1, 002);

System.out.println(u1);

}

}

結(jié)果

總結(jié)

以上是生活随笔為你收集整理的java动态变量名反射_Java动态性—反射 - Eclipse666的个人空间 - OSCHINA - 中文开源技术交流社区...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。