❶ java 中怎麼獲得以該字元串命名的變數
實現以上場景,在java中有多種方法,最直接方式的是通過反射獲取,但是反射有較大的性能損耗,一般不建議用在運行階段反射,大多開源框架是在初始化的時候通過反射來實例化。
1、通過扮渣塵反射獲取
packagetest;
importjava.lang.reflect.Field;
publicclassDemo2{
publicstaticvoidmain(String[]args),IllegalAccessException,NoSuchFieldException,SecurityException{
Stringop="strA";
Testt=newTest();
///通過類的位元組碼得到該類中聲明的所有屬性,無論私有或公有
Fieldstrs=Test.class.getDeclaredField(op);
//設置訪問許可權(這點對於有過android開發經驗的可以說很熟悉)
strs.setAccessible(true);
廳禪//得到私有的變數值
String[]as=(String[])strs.get(t);
System.out.println(as.length);
}
}
classTest{
privateString[]strA=newString[]{"a","b","c"};
privateString[]strB梁槐=newString[]{"d","e","f"};
}
packagetest;
importjava.util.HashMap;
importjava.util.Map;
publicclassDemo2{
publicstaticvoidmain(String[]args),IllegalAccessException,NoSuchFieldException,SecurityException{
Map<String,String[]>map=newHashMap<String,String[]>();
map.put("strA",newString[]{"a","str","c"});
map.put("strB",newString[]{"d","e","f"});
Stringop="strB";
Stringresult=map.get(op)[0];//"d"
}
}
以上兩種方法雖然都能實現需求,但是在實際情況中還是得看具體的情況來界定選擇。
❷ 為什麼使用java反射
Java反射最大的好處就是能在運行期間,獲得某個類的結構、成員變數,用來實例化。
下列是具體使用場景:假如我們有兩個程序員,一個程序員在寫程序的時候,需要使用第二個程序員所寫的類,但第二個程序員並沒完成他所寫的類。那麼第一個程序員的代碼能否通過編譯呢?這是不能通過編譯的。利用Java反射的機制,就可以讓第一個程序員在沒有得到第二個程序員所寫的類的時候,來完成自身代碼的編譯。Java的反射機制它知道類的基本結構,這種對Java類結構探知的能力,我們稱為Java類的「自審」。大家都用過Jcreator和eclipse。當我們構建出一個對象的時候,去調用該對象的方法和屬性的時候。一按點,編譯工具就會自動的把該對象能夠使用的所有的方法和屬性全部都列出來,供用戶進行選擇。這就是利用了Java反射的原理,是對我們創建對象的探知、自審。
❸ JAVA中反射是什麼
JAVA中反射是動態獲取信息以及動態調用對象方法的一種反射機制。
Java反射就是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;並且能改變它的屬性。而這也是Java被視為動態語言的一個關鍵性質。
Java反射的功能是在運行時判斷任意一個對象所屬的類,在運行時構造任意一個類的對象,在運行時判斷任意一個類所具有的成員變數和方法,在運行時調用任意一個對象的方法,生成動態代理。
(3)java反射類變數擴展閱讀:
JAVA中反射實例:
1、Class superClass=clazz.getSuperclass();//獲取父類。
System.out.println("getSuperclass:"+superClass)。
2、Class[] interfaces=clazz.getInterfaces();//獲取實現介面。
System.out.println("getInterfaces:"+interfaces.length)。
3、Constructor[] cons=clazz.getConstructors();//構造方法。
System.out.println("getConstructors:"+cons.length)。
參考資料來源:網路: JAVA反射機制
❹ java如何利用反射機製得到一個類中為數組類型的成員變數的值
寫了個例子,請仔細查看代碼,具體過程需要你自己對照java API 再研究,
先定義了一個普通的學生類,如下:
publicclassStudent{
privateintid;
privateStringname;
privateintage;
privateString[]aiHao;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicString[]getAiHao(){
returnaiHao;
}
publicvoidsetAiHao(String[]aiHao){
this.aiHao=aiHao;
}
}
對學生類進行反射
publicclassTest3{
publicstaticvoidmain(String[]args){
Students=newStudent();
s.setId(1);
s.setName("張三");
s.setAge(23);
s.setAiHao(newString[]{"足球","籃球","上網"});
try{
//獲取所有的變數
Field[]fields=Student.class.getDeclaredFields();
//循環處理變數
for(Fieldf:fields){
f.setAccessible(true);
Objectvalue=f.get(s);//取變數的值
System.out.print("變數名稱為:"+f.getName());
if(value.getClass().isArray()){//判斷是否是數組
Object[]arr=(Object[])value;//裝換成數組
System.out.println(",變數值等於:"+Arrays.toString(arr));
//這里還可以做額外處理,判斷數組的類型如下面注釋的代碼
/*
for(Objecta:arr){
System.out.println("參數類型"+a.getClass().getName());
//同樣運用反射的機製做額外處理
}
*/
}else{
//非數組類型,普通處理
System.out.println(",變數值等於:"+value);
}
f.setAccessible(false);
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
❺ 能說一下java的反射機制嗎
反射:一個類有多個組成部分,例如:成員變數、方法、構造方法等
反射就是載入類,並解剖出類的各個組成部分
java中有一個Class類用於代表某一個類的位元組碼。Class類提供載入某個位元組碼的方法:forName()
forName方法用於載入某個類的位元組碼到內存中,並使用Class對象進行封裝
另外兩種得到Class對象的方式:
類名.class
對象。getClass()
SUN公司為簡化創建對象的方法,它在Class對象中也提供了一個newInstance方法,用於創建類的對象,這樣開發人員可以避免每次都需要去反射Constructor類以創建對象
不過需要注意的是,Class.newInstance方法內部是反射類無參的構造函數創建的對象,所以利用此種方式創建類對象時,類必須有一個無參的構造函數
總結如下:反射機制是開發框架時才運用到的技術
❻ Java通過反射可以設置私有變數的好處有哪
Java通過反射可以設置私有變數的好處有
public class PrivateTest { private String name = "hello"; public String getName() { return name; } } public class ReflectionTest { public static void main(String[] args) throws Exception { PrivateTest pt = new PrivateTest(); Class clazz = PrivateTest.class; Field field = clazz.getDeclaredField("name"); field.setAccessible(true); field.set(pt, "world"); field.setAccessible(false); System.out.println(pt.getName()); } } 這樣通過反射可以設置私有變數,Java當時設計的時候是出於什麼考慮的呢?
但是也有應用的場景,可以想到的是: hibernate中你定義實體類及相應的欄位(和資料庫表對應),你可以在映射文件中配置: 當你從資料庫中獲取到數據後,是調用類的setxxx()方法,還是直接給欄位賦值,這里欄位是可以設置成private的,用的就是反射。那java反射可以設置私有變數的值,是好處多還是壞處多呢? 問題補充:robertliudeqiang 寫道提供了一種介面吧,一般情況下不會用的。
但是也有應用的場景,可以想到的是: hibernate中你定義實體類及相應的欄位(和資料庫表對應),你可以在映射文件中配置: 當你從資料庫中獲取到數據後,是調用類的setxxx()方法,還是直接給欄位賦值,這里欄位是可以設置成private的,用的就是反射。目前反射設置private變數的值,還未看出是有好處 的。
那應該是java的一個問題遺留,為了兼容沒法解決的。