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

java 反射機制

編輯:關於JAVA

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


本文導引:

經過反射機制

獲取類的根本信息 獲取類的注解信息 獲取泛型信息
package reflection;
@AnnotationUserTable("datebaseExample")
public class User {
  @AnnotationUserField(uName="name",type="varchar",length=10)
  private String name;
  @AnnotationUserField(uName="age",type="int",length=3)
  private int age;
  @AnnotationUserField(uName="sex",type="char",length=2)
  private String sex;
  public User() {
    super();
  }
  public User(String name, int age, String sex) {
    super();
    this.name = name;
    this.age = age;
    this.sex = sex;
  }
  public String getName() {
    return name;
  }
  public void setName() {
    this.name = "test";
  }
  public int getAge() {
    return age;
  }
  public String getSex() {
    return sex;
  }
  public void setSex(String sex) {
    this.sex = sex;
  }
}

bean:User
package reflection;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value={ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME) 
public @interface AnnotationUserTable {
  String value();
}

自定義注解:類注解
package reflection;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value={ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationUserField {
  String uName();
  String type();
  int length();  
}

自定義注解:屬性注解
package reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Demo01 {
  static Class<?> c = null;
  public static void main(String[] args) {
      try {
        c = Class.forName("reflection.User");
      } catch (ClassNotFoundException e) {
        e.printStackTrace();
      }
    test();//獲取類的屬性、辦法等信息
  }
  static void test(){
    try {
      // 獲取類的稱號
      System.out.println("獲取類的稱號");
      System.out.println("getName():" + c.getName());// 取得包名+類名
      System.out.println("getSimpleName():" + c.getSimpleName());// 取得類名
      System.out.println("getCanonicalName():" + c.getCanonicalName());// 取得類名
      System.out.println("*******************************");
      // 獲取屬性信息
      System.out.println("獲取屬性信息");
      Field[] fields = c.getDeclaredFields();
      // Field[] fields = c.getFields(); 只能獲取public修飾的屬性信息
      for (Field f : fields) {
        String fName = f.getName();
        System.out.println(c.getDeclaredField(fName));
      }
      System.out.println("*******************************");
      // 獲取辦法信息
      System.out.println("獲取辦法信息");
      Method[] methods = c.getDeclaredMethods();
      for (Method m : methods) {
        // String mName = m.getName();
        System.out.println(m.getName() + "-->" + m);
      }
      System.out.println("經過稱號獨自獲取對應的getName辦法:" + c.getDeclaredMethod("getName"));
      System.out.println("經過稱號獨自獲取對應的setSex辦法:" + c.getDeclaredMethod("setSex", String.class));// 辦法有參,必需傳遞參數類型
      System.out.println("*******************************");
      // 獲取結構器信息
      System.out.println("獲取結構器信息");
      Constructor<?>[] constructor = c.getConstructors();
      for (Constructor<?> cons : constructor) {
        System.out.println(cons);
      }
    } catch (NoSuchFieldException | SecurityException e) {
      e.printStackTrace();
    } catch (NoSuchMethodException e) {
      e.printStackTrace();
    }
  }
}

main1:經過反射機制獲取類的根本信息

output:

獲取類的稱號
getName():reflection.User
getSimpleName():User
getCanonicalName():reflection.User
*******************************
獲取屬性信息
private java.lang.String reflection.User.name
private int reflection.User.age
private java.lang.String reflection.User.sex
*******************************
獲取辦法信息
getName-->public java.lang.String reflection.User.getName()
setName-->public void reflection.User.setName()
setSex-->public void reflection.User.setSex(java.lang.String)
getSex-->public java.lang.String reflection.User.getSex()
getAge-->public int reflection.User.getAge()
經過稱號獨自獲取對應的getName辦法:public java.lang.String reflection.User.getName()
經過稱號獨自獲取對應的setSex辦法:public void reflection.User.setSex(java.lang.String)
*******************************
獲取結構器信息
public reflection.User()
public reflection.User(java.lang.String,int,java.lang.String)

View Console

上面的例子,是經過反射機制獲取類的注解信息。

package reflection;
import java.lang.reflect.Field;
/**
 * 獲取類的屬性、辦法等信息
 * 1.獲取元素對象(如屬性)(留意:讀取類的注解,看似要少一步)
 * 2.獲取該元素對象的指定類型的注解對象
 * 3.讀取注解對象相應的值
 */
public class Test02 {
  static Class<?> c = null;
  public static void main(String[] args) {
      try {
        c = Class.forName("reflection.User");
      } catch (ClassNotFoundException e) {
        e.printStackTrace();
      }
    test();
  }
  static void test(){
    try {
      // 獲取類的指定注解
      System.out.println("***********類的指定注解**************");
      AnnotationUserTable table = (AnnotationUserTable)c.getAnnotation(AnnotationUserTable.class);
      System.out.println(table.value());
      // 獲取屬性的指定注解
      System.out.println("***********屬性的指定注解*************");
      Field field = c.getDeclaredField("name");
      AnnotationUserField annoField = (AnnotationUserField)field.getAnnotation(AnnotationUserField.class);
      System.out.println(annoField.uName()+"\t"+annoField.type()+"\t"+annoField.length());
      // 依據取得的表名、字段的信息,拼寫出DDL語句,然後經過JDBC銜接數據庫查詢
    } catch (NoSuchFieldException e) {
      e.printStackTrace();
    } catch (SecurityException e) {
      e.printStackTrace();
    }
  }
}

output:

***********類的指定注解**************
datebaseExample
***********屬性的指定注解*************
name  varchar  10

上面的例子,是經過反射機制獲取泛型信息

package reflection;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
/**
 * 經過反射機制獲取泛型
 * @author Administrator
 *
 */
public class Test03 {  
  public static void main(String[] args) {
    Class<?> c = Test03.class;
    try {
      System.out.println("*******獲取參數值的類型**********");
      Method m1 = c.getDeclaredMethod("method01", Map.class,List.class);
      Type[] types = m1.getGenericParameterTypes();
      for(Type t:types){
        System.out.println(t.getTypeName());
        System.out.println(t.toString());        
      }
      System.out.println("*******獲取前往值的類型**********");
      Method m2 = c.getDeclaredMethod("method02");
      Type ret = m2.getGenericReturnType();
      System.out.println(ret.getTypeName());
      System.out.println(ret.toString());
    } catch (NoSuchMethodException | SecurityException e) {
      e.printStackTrace();
    }
  }
  public void method01(Map<String,String> args1,List<Integer> args2){
  }
  public Map<String,String> method02(){
    return null;
  }
}

經過反射機制獲取泛型信息

output:

java.util.Map<java.lang.String, java.lang.String>
java.util.Map<java.lang.String, java.lang.String>
java.util.Map<java.lang.String, java.lang.String>
java.util.Map<java.lang.String, java.lang.String>
java.util.List<java.lang.Integer>
java.util.List<java.lang.Integer>

View Console

以上就是本文的全部內容,希望本文的內容對大家的學習或許任務能帶來一定的協助,同時也希望多多支持!

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