Ⅰ 大神解釋一下java反射有什麼作用
反射的作用可謂是博大精深,JDK動態代理生成代理類的位元組碼後,首先把這個類通過defineclass定義專成一個類,屬然後用class.for(name)會把該類載入到jvm,之後我們就可以通過,A.class.GetMethod()獲取其方法,然後通過invoke調用其方法,在調用這個方法時,實際上會通過被代理類的引用再去調用原方法。
Java反射包reflection提供對Class,Method,field,constructor1 等信息的封裝類型
通過這些api可以輕易獲得一個類的各種信息並且可以進行實例化,方法調用等。
類中的private參數可以通過setaccessible方法強制獲取。
Ⅱ 如何通過java 反射 調用一個 含有 可變參數的 方法呢
java反射調用可變參數的方法的方式是傳入objects參數,如下代碼:
publicclassReflect{
publicstaticvoidmain(String[]args)throwsException{
Class<?>clazz=Single.class;
Singlesingle=(Single)clazz.newInstance();
List<String>list=newArrayList<String>(){
=1L;
{
add("fuck");
add("ni");
add("mei");
}
};
//獲取method兩種方式,在method中數組的的空間大小是可以隨便寫的不一定使用0
/*1*/
Methodmethod=clazz.getDeclaredMethod("method",Array.newInstance(Object.class,0).getClass());
/*2*/
method=clazz.getDeclaredMethod("method",(newObject[0]).getClass());//初始化參數
/*1*/
Objectobjs=Array.newInstance(Object.class,2);
Array.set(objs,0,list);
Array.set(objs,1,"23");
method.invoke(single,objs);
/*2*/
Object[]objects={1,"fuck",list};
method.invoke(single,newObject[]{objects});
}
}
classSingle{
publicvoidmethod(Object...objs){
System.out.println(Arrays.deepToString(objs));
}
}
結果:
[[fuck,ni,mei],23]
[1,fuck,[fuck,ni,mei]]
Ⅲ java用反射來執行類方法會產生對象嗎如果產生對象,多線程下對同一個類進行反射調用會不會產生多個對象
/**
*其實反射機制調用方法的過程:
*1類位元組碼注冊。
*2創建對象(newnewInstance())。
*3反射機制調用方法。
*所以反射機制和普通的創建對象的方法(new方式)是一樣的。
*多線程下利用反射機制創建對象調用方法和多線程普通方式創建對象並調用方法是一樣。
*只不過反射的好處是框架化,參數化
*下面是利用反射創建ArrayList,並調用ArrayList的add()。
*/
publicstaticvoidmain(String[]args)throwsException{
//反射機制注冊ArrayList
Classclazz=Class.forName("java.util.ArrayList");
//反射創建對象(無參)
List<String>list=(List<String>)clazz.newInstance();
//反射獲取方法
Methodmethod=clazz.getMethod("add",Object.class);
//反射調用方法
method.invoke(list,"remind");
//測試
for(Stringval:list){
System.out.println(val);
}
}
Ⅳ java反射中的newInstance的使用
其實類就是一個對象么。object就是對象的意思。
object就是泛指所有的類,而我們常用的 A a = new A();這種寫法就是具體化了。其實也可以寫成Object ojb = new A();
newIntance()就是對象的實例化,返回的一個對象,如果知道具體對象的時很么的話,也可以直接用該對象來接受 A a = c.newInstance()
Ⅳ 能說一下java的反射機制嗎
反射:一個類有多個組成部分,例如:成員變數、方法、構造方法等
反射就是載入類,並解剖出類的各個組成部分
java中有一個Class類用於代表某一個類的位元組碼。Class類提供載入某個位元組碼的方法:forName()
forName方法用於載入某個類的位元組碼到內存中,並使用Class對象進行封裝
另外兩種得到Class對象的方式:
類名.class
對象。getClass()
SUN公司為簡化創建對象的方法,它在Class對象中也提供了一個newInstance方法,用於創建類的對象,這樣開發人員可以避免每次都需要去反射Constructor類以創建對象
不過需要注意的是,Class.newInstance方法內部是反射類無參的構造函數創建的對象,所以利用此種方式創建類對象時,類必須有一個無參的構造函數
總結如下:反射機制是開發框架時才運用到的技術
Ⅵ java中用反射, newInstance一個自定義類的時候總是java.lang.NullPointerException,很迷惑
你的數組元素沒有初始化。在byTwo[i].aaa =i;前面加上byTwo[i]=new My();並且用大括弧括起來,
在byOne[i].aaa =i;前面加上byOne[i]=new My();並且用大括弧括起來,就行了。
完整的程序如下:
package myInstance;
import java.lang.reflect.Array;
public class ArrayUtils {
public static <T> T[] newArrayByArrayClass(Class<T[]> clazz, int length) {
return (T[]) Array.newInstance(clazz.getComponentType(), length);
}
public static <T> T[] newArrayByClass(Class<T> clazz, int length) {
return (T[]) Array.newInstance(clazz, length);
}
public static void main(String[] args) {
My[] byTwo = null;
byTwo = newArrayByClass(My.class, 10);//第一種方法
for(int i = 0;i < 10; i ++){
byTwo[i]=new My();
byTwo[i].aaa =i;
}
My[] byOne =null;
byOne = newArrayByArrayClass(My[].class, 10);//第二種方法
for(int i = 0;i < 10; i ++){
byOne[i]=new My();
byOne[i].aaa =i;
}
}
}
//定義「My」類
package myInstance;
public class My
{
public int aaa;
public My(){}
}
Ⅶ java反射機制詳解
在Java運行時刻,能否知道一個類的屬性方法並調用改動之?對於任意一個對象,能否知道他的所屬類,並調用他的方法?答案是肯定的。這種動態的獲取信息及動態調用方法的機制在Java中稱為「反射」(reflection)。
Java反射機制主要提供以下功能:
在運行時判斷任意一個對象所屬的類;
在運行時構造任意一個類的對象;
在運行時判斷任意一個類所具有的成員變數和方法;
在運行時調用任意一個對象的方法。
Reflection 是Java被視為動態(或准動態)語言的一個關鍵性質。這個機制允許程序在運行時透過Reflection APIs取得任何一個已知名稱的class的內部信息,包括其modifiers(諸如public, static 等等)、superclass(例如Object)、實現之interfaces(例如Serializable),也包括fields和methods 的所有信息,並可於運行時改變fields內容或調用methods。
一般而言,開發者社群說到動態語言,大致認同的一個定義是:「程序運行時,允許改變程序結構或變數類型,這種語言稱為動態語言」。
在JDK中,主要由以下類來實現Java反射機制,這些類都位於java.lang.reflect包中:
Class類:代表一個類;
Field 類:代表類的成員變數(成員變數也稱為類的屬性);
Method類:代表類的方法;
Constructor 類:代表類的構造方法;
Array類:提供了動態創建數組,以及訪問數組的元素的靜態方法;
至於全部的你可以看看參考資料。我看這個資料不錯
Ⅷ java反射,調用private的方法
soeasy
Stringpath=「com.test.B」
Classclazz=Class.forName(path);//獲得b的反射
Bb=(B)clazz.newInstance();//前提是b類有個無參構造函數
Methodm=clazz.getDeclaredMehod("SetName",String.class);
m.setAccessible(true);//不做安全檢查,你才可以去訪問專私有方法
m.invoke(b,"哈哈");
這里是給屬B裡面的(下面這個方法進行調用賦值)
privatevoidSetName(Strings){}
psgetDeclaredMehod是對私有的方法進行調用要訪問必須加setAccessible
getMehod是對通用方法進行調用,不用加setAccessible