java反射,java反射機制

來源:互聯網
上載者:User

java反射,java反射機制

人貴有自知之明。不會的立馬去學。忘記的立馬去補。

由於我的反射是1年前學的。很多東西都已忘記。昨日阿里面試提起反射。我只迷糊的記得有Class.forName和getMethod、newInstant這些東西。

其實我覺得java這些東西內部知識很多。Spring我知道是反射。大概怎麼做的我也清楚。但若離開了Eclipse離開了intellij讓我空手寫代碼確實沒有API文檔我真不行。

下面我簡單的回顧了一下反射。Spring的AOP面向切面編程。我喜歡叫面向介面。不管怎樣。大致上這種架構都是在spring.xml中配置bean。現在也有很多程式不喜歡配置。而更喜歡用註解的形式什麼@Service、@Controller、@Resource之類的註解。通過註解的組合達到0配置的目的。但大意都是基於反射實現的。

例如我們先寫個簡單的Pojo

public class Student{private String name;public Student(){}public Student(String name){this.name = name;}public String getName(){return name;}public void setName(String name){this.name = name;}}
之後我們再寫個測試類別

import java.lang.reflect.Constructor;import java.lang.reflect.Method;public class test{/** * @param args */public static void main(String[] args) throws Exception{Class cls_1 = Class.forName("Student"); //通過名稱擷取Class,這裡一般是需要有包名首碼的。Class cls_2 = Student.class;//直接通過.class檔案擷取Classif(cls_1.equals(cls_2)) System.out.println("this is sample Class");Student stu = (Student)cls_1.newInstance();   //通過無參構造方法new擷取對象,若無空參構造方法會拋異常Constructor<Student> sc = cls_1.getConstructor(String.class); //若類中不含無參構造方法則會拋異常這裡就需要先擷取指定的構造方法Student stu2 = sc.newInstance("haha");System.out.println(stu2.getName());Method me1 = cls_1.getMethod("setName", String.class); //通過名稱+參數類型的class擷取Method方法me1.invoke(stu, "jungle"); //調用指定執行個體的指定參數System.out.println(stu.getName());}}
運行結果

this is sample Classjunglehaha

是不是很簡單呢。其實我覺得各種語言學多了不免忘記。但查API文檔和原理懂就行了。空手寫代碼的除了上個世紀80、90年代那個用Dos用打孔機寫代碼的年代。java東西這麼多。常用的記住忘記查文檔。更好得利用資源例如StackOverflow這種東西。不扯了。我是水貨233333


java反射機制

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Admin {
public Admin(){

}
private String id = "";

public String getId() {
System.out.print(id);
return id;
}
public void setId(String id) {
this.id = id;
}

public static void main(String[] args)
throws ClassNotFoundException, InstantiationException, IllegalAccessException,
SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {

String str="com.spring.event.Admin";
Class c=Class.forName(str);
Object obj=c.newInstance();

// 這裡是裡設定屬性的值
Method m = c.getMethod("setId",new Class[]{Class.forName("java.lang.String")});
m.invoke(obj,new Object[]{"penghao122"});

// 這裡是裡擷取屬性的值
m = c.getMethod("getId",new Class[]{});
m.invoke(obj,new Object []{});

}

}

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Admin {
public Admin(){

}
private String id = "";

public String getId() {
System.out.print(id);
return id;
}
public void setId(String id) {
this.id = id;
}

public static void main(String[] args)
throws ClassNotFoundException, InstantiationException, IllegalAccessException,
SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {

String str="com.spring.event.Admin";
Class c=Class.forName(str);
Object ......餘下全文>>
 
JAVA中反射是什

反射的概念是由Smith在1982年首次提出的,主要是指程式可以訪問、檢測和修改它本身狀態或行為的一種能力。這一概念的提出很快引發了電腦科學領域關於應用反射性的研究。它首先被程式語言的設計領域所採用,並在Lisp和物件導向方面取得了成績。其中LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基於反射機制的語言。最近,反射機制也被應用到了視窗系統、作業系統和檔案系統中。

反射本身並不是一個新概念,它可能會使我們聯想到光學中的反射概念,儘管電腦科學賦予了反射概念新的含義,但是,從現象上來說,它們確實有某些相通之處,這些有助於我們的理解。在電腦科學領域,反射是指一類應用,它們能夠自描述和自控制。也就是說,這類應用通過採用某種機制來實現對自己行為的描述(self-representation)和監測(examination),並能根據自身行為的狀態和結果,調整或修改應用所描述行為的狀態和相關的語義。可以看出,同一般的反射概念相比,電腦科學領域的反射不單單指反射本身,還包括對反射結果所採取的措施。所有採用反射機制的系統(即反射系統)都希望使系統的實現更開放。可以說,實現了反射機制的系統都具有開放性,但具有開放性的系統並不一定採用了反射機制,開放性是反射系統的必要條件。一般來說,反射系統除了滿足開放性條件外還必須滿足原因串連(Causally-connected)。所謂原因串連是指對反射系統自描述的改變能夠立即反映到系統底層的實際狀態和行為上的情況,反之亦然。開放性和原因串連是反射系統的兩大基本要素。13700863760

Java中,反射是一種強大的工具。它使您能夠建立靈活的代碼,這些代碼可以在運行時裝配,無需在組件之間進行源代錶鏈接。反射允許我們在編寫與執行時,使我們的程式碼能夠接入裝載到JVM中的類的內部資訊,而不是原始碼中選定的類協作的代碼。這使反射成為構建靈活的應用的主要工具。但需注意的是:如果使用不當,反射的成本很高。

二、Java中的類反射:
Reflection 是 Java 程式開發語言的特徵之一,它允許運行中的 Java 程式對自身進行檢查,或者說“自審”,並能直接操作程式的內部屬性。Java 的這一能力在實際應用中也許用得不是很多,但是在其它的程式設計語言中根本就不存在這一特性。例如,Pascal、C 或者 C++ 中就沒有辦法在程式中獲得函數定義相關的資訊。

1.檢測類:

1.1 reflection的工作機制

考慮下面這個簡單的例子,讓我們看看 reflection 是如何工作的。

import java.lang.reflect.*;
public class DumpMethods {
public static void main(String args[]) {
try {
Class c = Class.forName(args[0]);
Method m[] = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++)
System.out.println(m[i].toString());
} catch (Throwable e) {
System.err.println(e);
}
}
}

按如下......餘下全文>>
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.