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

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

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

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

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

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

本篇將從以下幾個方面講述反射的知識:

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

一、什么是class類

在面向?qū)ο蟮氖澜缋?,萬物皆對象。類是對象,類是java.lang.Class類的實例對象。另外class類只有java虛擬機(jī)才能new出來。任何一個類都是Class 類的實例對象。這實例對象有三種表達(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");
 
//可以通過類的類型創(chuàng)建該類的實例對象
User user=(User)c1.newInstance();
}

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

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

三、獲取方法信息

基本的數(shù)據(jù)類型,void關(guān)鍵字都Class 類的實例;可以通過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());

獲取類的所有方法,并打印出來:

public static void printClassInfo(Object object){
  Class c=object.getClass();
  System.out.println("類的名稱:"+c.getName());
  /**
   * 一個成員方法就是一個method對象
   * 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);
  }
}

運行:

類的名稱: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);
  }

運行:

[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);
  }

運行:

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 ,)
…

六、方法反射的操作

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

方法的反射操作:

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

舉個例子:

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();
  }
 }

運行:

20

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

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

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

相關(guān)文章

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

    mybatis-plus 使用Condition拼接Sql語句各方法的用法

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

    mybatisplus之使用@Select解讀

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

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

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

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

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

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

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

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

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

    Spring mvc Controller和RestFul原理解析

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

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

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

    Java中List的使用方法簡單介紹

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

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

    實際項目開發(fā)中,很多業(yè)務(wù)場景下都會遇見集合去重。在說到List集合去重之前,首先我們回顧下普通類型的list如何去重
    2021-09-09

最新評論