JAVA中反射是動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的一種反射機制。
成都創(chuàng)新互聯(lián)公司主營桂東網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都App制作,桂東h5小程序定制開發(fā)搭建,桂東網(wǎng)站營銷推廣歡迎桂東等地區(qū)企業(yè)咨詢
Java反射就是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意方法和屬性;并且能改變它的屬性。而這也是Java被視為動態(tài)語言的一個關(guān)鍵性質(zhì)。
Java反射的功能是在運行時判斷任意一個對象所屬的類,在運行時構(gòu)造任意一個類的對象,在運行時判斷任意一個類所具有的成員變量和方法,在運行時調(diào)用任意一個對象的方法,生成動態(tài)代理。
擴展資料:
JAVA中反射實例:
1、Class superClass=clazz.getSuperclass();//獲取父類。
System.out.println("getSuperclass:"+superClass)。? ?
2、Class[] interfaces=clazz.getInterfaces();//獲取實現(xiàn)接口。
System.out.println("getInterfaces:"+interfaces.length)。
3、Constructor[] cons=clazz.getConstructors();//構(gòu)造方法。
System.out.println("getConstructors:"+cons.length)。
參考資料來源:百度百科: JAVA反射機制
import java.lang.reflect.Method;
public class InvokeTester
{
public int add(int param1, int param2)
{
return param1 + param2;
}
public String echo(String message)
{
return "hello: " + message;
}
public static void main(String[] args) throws Exception
{
Class? classType = InvokeTester.class;
Object invokeTester = classType.newInstance();
// System.out.println(invokeTester instanceof InvokeTester); //返回true
Method addMethod = classType.getMethod("add", new Class[] { int.class,int.class }); //第二個形參表示指定的add方法要接收為int的類型的兩個參數(shù)
Object result = addMethod.invoke(invokeTester, new Object[]{1, 2}); //反射調(diào)用,將1,2傳入InvokeTester.Class的實例invokeTester里的add方法。得返回的結(jié)果。
System.out.println((Integer)result);
System.out.println("---------------------");
Method echoMethod = classType.getMethod("echo", new Class[]{String.class});
Object result2 = echoMethod.invoke(invokeTester, new Object[]{"tom"});
System.out.println((String)result2);
}
}
1.Java動態(tài)加載類和靜態(tài)加載類的區(qū)別
new創(chuàng)建對象的方式稱作為靜態(tài)加載,而使用Class.forName("XXX")稱作為動態(tài)加載,它們倆本質(zhì)的區(qū)別在于靜態(tài)加載的類的源程序在編譯時期加載(必須存在),而動態(tài)加載的類在編譯時期可以缺席(源程序不必存在)。
2.為什么需要動態(tài)加載類
對于我自己的理解,動態(tài)加載類增加了程序的靈活性。比如一個程序中有50個功能,但你可能只會使用其中的一個,如果你用的是靜態(tài)加載的方式,你必須在編譯前提供100個功能的所有定義,否則無法編譯通過,若你使用的是動態(tài)加載機制,則不需要如此大費周章,用哪一個就定義哪一個即可。
靜態(tài)加載:
public class Office_Static {
public static void main(String[] args) {
//new 創(chuàng)建對象,是靜態(tài)加載類,在編譯時刻就需要加載所有的可能使用到的類
if("Word".equals(args[0])){
Word w = new Word();
w.start();
}
if("Excel".equals(args[0])){
Excel e = new Excel();
e.start();
}
}
}
這個程序編譯時必須有Word和Excel這兩個類存在才行,即使判斷后用不到Excel也要加載
動態(tài)加載:
接口OfficeAble :
public interface OfficeAble {
public void start();}
給你一個小的實例代碼:
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
public class test {
public static void main(String args[]) throws NoSuchMethodException,
IllegalAccessException, InvocationTargetException {
Foo foo = new Foo("這個一個Foo對象!");
Class clazz = foo.getClass();
Method m1 = clazz.getDeclaredMethod("outInfo");
Method m2 = clazz.getDeclaredMethod("setMsg", String.class);
Method m3 = clazz.getDeclaredMethod("getMsg");
m1.invoke(foo);
m2.invoke(foo, "重新設(shè)置msg信息!");
String msg = (String) m3.invoke(foo);
System.out.println(msg);
}
}
class Foo {
private String msg;
public Foo(String msg) {
this.msg = msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void outInfo() {
System.out.println("這是測試Java反射的測試類");
}
}
網(wǎng)站標題:java代碼反射實例下載 通俗理解java反射舉例子
地址分享:http://jinyejixie.com/article22/hephjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站改版、網(wǎng)站設(shè)計公司、網(wǎng)站導航、自適應網(wǎng)站、網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)