欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于Java反射機(jī)制 你需要知道的事情

 更新時(shí)間:2017年09月20日 16:38:08   作者:方志朋  
這篇文章主要介紹了Java反射機(jī)制的相關(guān)內(nèi)容,涉及了class類的動(dòng)態(tài)加載,獲取成員變量、構(gòu)造函數(shù)信息等信息,需要的朋友可以參考下。

大家都知道,要讓Java程序能夠運(yùn)行,那么就得讓Java類要被Java虛擬機(jī)加載。Java類如果不被Java虛擬機(jī)加載,是不能正常運(yùn)行的?,F(xiàn)在我們運(yùn)行的所有的程序都是在編譯期的時(shí)候就已經(jīng)知道了你所需要的那個(gè)類的已經(jīng)被加載了。

Java的反射機(jī)制是在編譯并不確定是哪個(gè)類被加載了,而是在程序運(yùn)行的時(shí)候才加載、探知、自審。使用在編譯期并不知道的類。這樣的特點(diǎn)就是反射。

反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語(yǔ)言的反射機(jī)制。

本篇將從以下幾個(gè)方面講述反射的知識(shí):

calss的使用 方法的反射 構(gòu)造函數(shù)的反射 成員變量的反射

一、什么是class類

在面向?qū)ο蟮氖澜缋?,萬(wàn)物皆對(duì)象。類是對(duì)象,類是java.lang.Class類的實(shí)例對(duì)象。另外class類只有java虛擬機(jī)才能new出來(lái)。任何一個(gè)類都是Class 類的實(shí)例對(duì)象。這實(shí)例對(duì)象有三種表達(dá)方式:

public class User{
} 
public class ClassTest{
User u=new User();
 //方式1:
 Class c1=User.class;
//方式2:
Class c2=u.getClass();
//方式3:
Class c3=Class.forName("com.forezp.User");
 
//可以通過(guò)類的類型創(chuàng)建該類的實(shí)例對(duì)象
User user=(User)c1.newInstance();
}

二、class類的動(dòng)態(tài)加載

Class.forName(類的全稱);該方法不僅表示了類的類型,還代表了動(dòng)態(tài)加載類。編譯時(shí)刻加載類是靜態(tài)加載、運(yùn)行時(shí)刻加載類是動(dòng)態(tài)加載類。

三、獲取方法信息

基本的數(shù)據(jù)類型,void關(guān)鍵字都Class 類的實(shí)例;可以通過(guò)get
ame();getSimpleName()獲取類的名稱。

Class c1=String.class;
Class c2=int.class;
Class c3=void.class;
System.out.println(c1.getName());
System.out.println(c2.getSimpleName());

獲取類的所有方法,并打印出來(lái):

public static void printClassInfo(Object object){
  Class c=object.getClass();
  System.out.println("類的名稱:"+c.getName());
  /**
   * 一個(gè)成員方法就是一個(gè)method對(duì)象
   * getMethod()所有的 public方法,包括父類繼承的 public
   * getDeclaredMethods()獲取該類所有的方法,包括private ,但不包括繼承的方法。
   */
  Method[] methods=c.getMethods();//獲取方法
  //獲取所以的方法,包括private ,c.getDeclaredMethods();
  for(int i=0;i<methods.length;i++){ parametertypes="methods[i].getParameterTypes();" pre="" returntype="methods[i].getReturnType();"></methods.length;i++){>
public class ReflectTest {
  public static void main(String[] args){
    String s="ss";
    ClassUtil.printClassInfo(s);
  }
}

運(yùn)行:

類的名稱:java.lang.String
booleanequals(java.lang.Object,)
java.lang.StringtoString()
inthashCode()
…

四、獲取成員變量的信息

也可以獲取類的成員變量信息

public static void printFiledInfo(Object o){
  Class c=o.getClass();
  /**
  * getFileds()獲取public
  * getDeclaredFields()獲取所有
  */
  Field[] fileds=c.getDeclaredFields();
  for(Field f:fileds){
   //獲取成員變量的類型
   Class filedType=f.getType();
   System.out.println(filedType.getName()+" "+f.getName());
  }
 }
public static void main(String[] args){
    String s="ss";
    //ClassUtil.printClassInfo(s);
    ClassUtil.printFiledInfo(s);
  }

運(yùn)行:

[C value 
int hash 
long serialVersionUID 
[Ljava.io.ObjectStreamField; serialPersistentFields 
java.util.Comparator CASE_INSENSITIVE_ORDER 
int HASHING_SEED 
int hash32

五、獲取構(gòu)造函數(shù)的信息

public static void printConstructInfo(Object o){
  Class c=o.getClass();
  Constructor[] constructors=c.getDeclaredConstructors();
  for (Constructor con:constructors){
   System.out.print(con.getName()+"(");
   Class[] typeParas=con.getParameterTypes();
   for (Class class1:typeParas){
    System.out.print(class1.getName()+" ,");
   }
   System.out.println(")");
  }
 }
public static void main(String[] args){
    String s="ss";
    //ClassUtil.printClassInfo(s);
    //ClassUtil.printFiledInfo(s);
    ClassUtil.printConstructInfo(s);
  }

運(yùn)行:

java.lang.String([B ,) 
java.lang.String([B ,int ,int ,) 
java.lang.String([B ,java.nio.charset.Charset ,) 
java.lang.String([B ,java.lang.String ,) 
java.lang.String([B ,int ,int ,java.nio.charset.Charset ,) 
java.lang.String(int ,int ,[C ,) 
java.lang.String([C ,boolean ,) 
java.lang.String(java.lang.StringBuilder ,) 
java.lang.String(java.lang.StringBuffer ,)
…

六、方法反射的操作

獲取一個(gè)方法:需要獲取方法的名稱和方法的參數(shù)才能決定一個(gè)方法。

方法的反射操作:

method.invoke(對(duì)象,參數(shù)列表);

舉個(gè)例子:

class A{
 public void add(int a,int b){
  System.out.print(a+b);
 }
 public void toUpper(String a){
  System.out.print(a.toUpperCase());
 }
}
public static void main(String[] args) {
  A a=new A();
  Class c=a.getClass();
  try {
   Method method=c.getMethod("add",new Class[]{int.class,int.class});
   //也可以 Method method=c.getMethod("add",int.class,int.class);
   //方法的反射操作
   method.invoke(a,10,10);
  }catch (Exception e){
   e.printStackTrace();
  }
 }

運(yùn)行:

20

本篇文章已經(jīng)講解了java反射的基本用法, 它可以在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類;在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象;在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法;在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法;生成動(dòng)態(tài)代理。

以上就是本文關(guān)于Java反射機(jī)制的全部?jī)?nèi)容,希望對(duì)大家有所幫助。

更多相關(guān)內(nèi)容可以參考:Java的RTTI和反射機(jī)制代碼分析、Java反射機(jī)制深入理解、Java 反射機(jī)制實(shí)例詳解。

相關(guān)文章

  • mybatis-plus 使用Condition拼接Sql語(yǔ)句各方法的用法

    mybatis-plus 使用Condition拼接Sql語(yǔ)句各方法的用法

    這篇文章主要介紹了mybatis-plus 使用Condition拼接Sql語(yǔ)句各方法的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • mybatisplus之使用@Select解讀

    mybatisplus之使用@Select解讀

    這篇文章主要介紹了mybatisplus之使用@Select解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java 添加、刪除、替換、格式化Word中的文本的步驟詳解(基于Spire.Cloud.SDK for Java)

    Java 添加、刪除、替換、格式化Word中的文本的步驟詳解(基于Spire.Cloud.SDK for Java)

    這篇文章主要介紹了Java 添加、刪除、替換、格式化Word中的文本(基于Spire.Cloud.SDK for Java),本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Mybatis 動(dòng)態(tài)表名+Map參數(shù)傳遞+批量操作詳解

    Mybatis 動(dòng)態(tài)表名+Map參數(shù)傳遞+批量操作詳解

    這篇文章主要介紹了Mybatis 動(dòng)態(tài)表名+Map參數(shù)傳遞+批量操作詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • java編程小白進(jìn)階包的作用詳解

    java編程小白進(jìn)階包的作用詳解

    這篇文章主要為大家介紹了java編程中包的作用詳解,文中通過(guò)示例分析方便大家更容易理解包的作用,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • idea生成類注釋和方法注釋的正確方法(推薦)

    idea生成類注釋和方法注釋的正確方法(推薦)

    這篇文章主要介紹了idea生成類注釋和方法注釋的正確方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Spring mvc Controller和RestFul原理解析

    Spring mvc Controller和RestFul原理解析

    這篇文章主要介紹了Spring mvc Controller和RestFul原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • JAVA使用ffmepg處理視頻的方法(壓縮,分片,合并)

    JAVA使用ffmepg處理視頻的方法(壓縮,分片,合并)

    這篇文章主要介紹了JAVA使用ffmepg處理視頻的方法,包括視頻壓縮分片合并功能,通過(guò)實(shí)例代碼講解的很詳細(xì),對(duì)java ffmepg處理視頻相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-05-05
  • Java中List的使用方法簡(jiǎn)單介紹

    Java中List的使用方法簡(jiǎn)單介紹

    這篇文章主要針對(duì)Java中List的使用方法為大家介紹了進(jìn)行簡(jiǎn)單介紹,List是個(gè)集合接口,只要是集合類接口都會(huì)有個(gè)“迭代子”( Iterator ),利用這個(gè)迭代子,就可以對(duì)list內(nèi)存的一組對(duì)象進(jìn)行操作,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Java關(guān)于List集合去重方案詳細(xì)介紹

    Java關(guān)于List集合去重方案詳細(xì)介紹

    實(shí)際項(xiàng)目開(kāi)發(fā)中,很多業(yè)務(wù)場(chǎng)景下都會(huì)遇見(jiàn)集合去重。在說(shuō)到List集合去重之前,首先我們回顧下普通類型的list如何去重
    2021-09-09

最新評(píng)論