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

簡略總結Java的反射機制的應用

編輯:關於JAVA

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


Java 的反射機制是使其具有靜態特征的異常症結的一種機制,也是在JavaBean 中普遍運用的一種特征。

簡略來講,一個類或許一個對象是具有上面幾種屬性的:
Method,Constructor,Field,其年夜致構造類圖以下:

我們如今用代碼來講明成績:

起首,我們看Class類,在Class類中,我們可以看見上面的幾個主要的辦法;

  • getInterfaces()
  • getSuperClass();
  • isInterface();

這是用來獲得一個類的接口或許超類,和斷定這個類是否是一個接口;

  • forName(String className);依據一個類名獲得一個響應的類類型;
  • getClassLoader();獲得這個類響應的類加載器;

和上面的幾種辦法:

getField(Method/Constructor)(s)(name); getDeclaredField(Method/Constructor)(s)();


分離是獲得這個類的響應的Constructor,field,method的;

差別在於,含有Declared的辦法可以或許獲得這個類所聲明的一切的屬性,而沒有Declared的只能獲得公共public的屬性;


而繼續了Member分離付與了這個三個類可以或許獲得聲明其的Class,用getDeclaringClass();在這裡我們再次引見一下Modifiers,我們都曉得在field或許Constructor,Method後面都含有若干潤飾符,如:

public static final String name="corey";

等等,我們運用getModifiers()可以或許拿到這個潤飾符的一個整形值,然後運用Modifier這個類的靜態辦法來停止斷定;如:
   Modifier.isStatic(int)等等;

接上去,我們來看看AccessibleObject的幾個重要的辦法,AccessibleObject中重要的幾個方法第一是
getAnnotation();獲得某個屬性的正文;
isAccessible();可否拜訪;假如不克不及拜訪,我們可以采用setAccessible(boolean)來設置其的可拜訪性;(這個我們在spring中看到過);

然後我們分離來看看這個三個類一些主要的特征:


Constructor:

  • newInstance(args):可以或許應用這個結構器獲得一個類的實例;


Field:

  • getType();獲得這個字段的類;
  • set/get(Object,value):一系列的根本類型字段的設置辦法或許Object的設置辦法;

Method:

  • getParameterTypes();獲得一切參數的類型;
  • getExceptionTypes();獲得一切拋出異常的類型;
  • invoke(Object,args);挪用Object對象的這個辦法,參數是args;

上面是一份實例代碼:

package org.corey.demo;
public interface IName {
  public String getFirstName();
  public void setFirstName(String firstName);
  public String getLastName();
  public void setLastName(String lastName);
}

package org.corey.demo;
public class Name {
  private String firstName;
  private String lastName;
  public String publicName;
  
  public Name(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  public Name() {
  }
  public String getFirstName() {
    return firstName;
  }
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
  public String getLastName() {
    return lastName;
  }
  public void setLastName(String lastName) {
    this.lastName = lastName;
  }
}


package org.corey.demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Demo {
  /**
   * @param args
   */
  public static void main(String[] args) {
    try {
      Class clazz = Class.forName("org.corey.demo.Name");
      Constructor con = clazz.getDeclaredConstructor(new Class[] {
          String.class, String.class });
      Name corey = (Name)(con.newInstance("corey", "zhou"));
      System.out.println(corey.getFirstName()+" "+corey.getLastName());
      Field[] fields=clazz.getDeclaredFields();
      for(int index=0;index<fields.length;index++){
        System.out.println(fields[index].getName()+" accessible "+fields[index].isAccessible());
        
      }
      Method[] methods=clazz.getDeclaredMethods();
      for(int index=0;index<methods.length;index++){
        System.out.println(methods[index].getName());
      }
      
      Field field=clazz.getDeclaredField("firstName");
      if(!field.isAccessible()){
        field.setAccessible(true);
        field.set(corey, "syna");
      }
      
      Method method=clazz.getDeclaredMethod("setLastName", new Class[]{String.class});
      
      method.invoke(corey, "wang");
      
      System.out.println(corey.getFirstName()+" "+corey.getLastName());
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}

console:

corey zhou
firstName accessible false
lastName accessible false
publicName accessible false
getFirstName
getLastName
setLastName
setFirstName
syna wang

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