程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java 反射機制知識詳細引見及總結

Java 反射機制知識詳細引見及總結

編輯:關於JAVA

Java 反射機制知識詳細引見及總結。本站提示廣大學習愛好者:(Java 反射機制知識詳細引見及總結)文章只能為提供參考,不一定能成為您想要的結果。以下是Java 反射機制知識詳細引見及總結正文


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

class 的運用 辦法的反射 結構函數的反射 成員變量的反射

一、什麼是class類

在面向對象的世界裡,萬物皆對象。類是對象,類是java.lang.Class類的實例對象。另外class類只要java虛擬機才干new出來。任何一個類都是Class 類的實例對象。這實例對象有三種表達方式:

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");

//可以經過類的類型創立該類的實例對象
User user=(User)c1.newInstance();
}

二、class類的靜態加載

Class.forName(類的全稱);該辦法不只表示了類的類型,還代表了靜態加載類。編譯時辰加載類是靜態加載、運轉時辰加載類是靜態加載類。

三、獲取辦法信息

根本的數據類型,void關鍵字都Class 類的實例;可以經過getame();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++){
      //失掉辦法的前往類型
      Class returnType=methods[i].getReturnType();
      System.out.print(returnType.getName());
      //失掉辦法名:
      System.out.print(methods[i].getName()+"(");

      Class[] parameterTypes=methods[i].getParameterTypes();
      for(Class class1:parameterTypes){
        System.out.print(class1.getName()+",");
      }
      System.out.println(")");
    }
  }

運轉:

類的稱號: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

五、獲取結構函數的信息

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

六、辦法反射的操作

獲取一個辦法:需求獲取辦法的稱號和辦法的參數才干決議一個辦法。

辦法的反射操作:

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

舉個例子:

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

本篇文章曾經解說了java反射的根本用法, 它可以在運轉時判別恣意一個對象所屬的類;在運轉時結構恣意一個類的對象;在運轉時判別恣意一個類所具有的成員變量和辦法;在運轉時調用恣意一個對象的辦法;生成靜態代理。

 感激閱讀,希望能協助到大家,謝謝大家對本站的支持!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved