天天看点

Java Reflection API学习

一、Java Reflection API的测试

package tigers;

import java.lang.reflect.*;

import java.util.*;

import java.sql.*;

import java.io.*;

public class Tiger7 {

 private final String name;

 private transient int id;

 public Tiger7() throws Exception {

  this("aa", 23);

 }

 public Tiger7(String name, int id){

  this.name = name;

  this.id = id;

 }

 public static void main(String[] args) {

  try {

   Class c = Class.forName("tigers.Tiger7");

   showFields(c);

   showConstructors(c);

   showMethods(c);

  } catch (Exception ce) {

   ce.printStackTrace();

  }

 }

 private static void showConstructors(Class c) {

  Constructor[] cons = c.getDeclaredConstructors();

  for (Constructor con : cons) {

   System.out.println("<<<<<<<< " + con + ">>>>>>>>");

  }

 }

 private Tiger7 my_method(String name, int id, Tiger7 t7) throws IOException, SQLException {

  return this;

 }

 private static void showFields(Class c) throws Exception {

  Tiger7 t1 = new Tiger7();

  Field[] fis = c.getDeclaredFields();

  for (Field f : fis) {

   System.out.println("........" + f + "........" +

     ", /ngetModifiers=" + Modifier.toString(f.getModifiers()) +

     ", /ngetName=" + f.getName());  

  }

 }

 private static void showMethods(Class c) throws Exception{

  java.lang.reflect.Method[] mes = c.getDeclaredMethods();

  for (Method m : mes) {

   System.out.println("************** " + m + " **************");

   System.out.println("getDeclaringClass=" + m.getDeclaringClass().getName() +

     ", /ngetExceptionTypes=" + Arrays.toString(m.getExceptionTypes()) +

     ", /ngetGenericExceptionTypes=" + Arrays.toString(m.getGenericExceptionTypes()) +

     ", /ngetParameterTypes=" + Arrays.toString(m.getParameterTypes()) +

     ", /ngetGenericParameterTypes=" + Arrays.toString(m.getGenericParameterTypes()) +

     ", /ngetReturnType=" + m.getReturnType() +

     ", /ngetGenericReturnType=" + m.getGenericReturnType() +

     ", /ngetModifiers=" + Modifier.toString(m.getModifiers()) +

     ", /ngetName=" + m.getName());

  }

 }

}

结果:

........private final java.lang.String tigers.Tiger7.name........,

getModifiers=private final,

getName=name

........private transient int tigers.Tiger7.id........,

getModifiers=private transient,

getName=id

<<<<<<<< public tigers.Tiger7(java.lang.String,int)>>>>>>>>

<<<<<<<< public tigers.Tiger7() throws java.lang.Exception>>>>>>>>

************** private static void tigers.Tiger7.showFields(java.lang.Class) throws java.lang.Exception **************

getDeclaringClass=tigers.Tiger7,

getExceptionTypes=[class java.lang.Exception],

getGenericExceptionTypes=[class java.lang.Exception],

getParameterTypes=[class java.lang.Class],

getGenericParameterTypes=[class java.lang.Class],

getReturnType=void,

getGenericReturnType=void,

getModifiers=private static,

getName=showFields

************** private static void tigers.Tiger7.showConstructors(java.lang.Class) **************

getDeclaringClass=tigers.Tiger7,

getExceptionTypes=[],

getGenericExceptionTypes=[],

getParameterTypes=[class java.lang.Class],

getGenericParameterTypes=[class java.lang.Class],

getReturnType=void,

getGenericReturnType=void,

getModifiers=private static,

getName=showConstructors

************** private static void tigers.Tiger7.showMethods(java.lang.Class) throws java.lang.Exception **************

getDeclaringClass=tigers.Tiger7,

getExceptionTypes=[class java.lang.Exception],

getGenericExceptionTypes=[class java.lang.Exception],

getParameterTypes=[class java.lang.Class],

getGenericParameterTypes=[class java.lang.Class],

getReturnType=void,

getGenericReturnType=void,

getModifiers=private static,

getName=showMethods

************** private tigers.Tiger7 tigers.Tiger7.my_method(java.lang.String,int,tigers.Tiger7) throws java.io.IOException,java.sql.SQLException **************

getDeclaringClass=tigers.Tiger7,

getExceptionTypes=[class java.io.IOException, class java.sql.SQLException],

getGenericExceptionTypes=[class java.io.IOException, class java.sql.SQLException],

getParameterTypes=[class java.lang.String, int, class tigers.Tiger7],

getGenericParameterTypes=[class java.lang.String, int, class tigers.Tiger7],

getReturnType=class tigers.Tiger7,

getGenericReturnType=class tigers.Tiger7,

getModifiers=private,

getName=my_method

************** public static void tigers.Tiger7.main(java.lang.String[]) **************

getDeclaringClass=tigers.Tiger7,

getExceptionTypes=[],

getGenericExceptionTypes=[],

getParameterTypes=[class [Ljava.lang.String;],

getGenericParameterTypes=[class [Ljava.lang.String;],

getReturnType=void,

getGenericReturnType=void,

getModifiers=public static,

getName=main

二、利用Java Reflection 动态创建对象数组

package tigers;

import java.lang.reflect.*;

public class Tiger11 {

 private String name;

 public Tiger11(String name) {

  this.name = name;

 }

 public String toString() {

  return "(" + name + ")";

 }

 public static void main(String[] args) {

  try {

   Class c = Class.forName("tigers.Tiger11");

   Object arrays = Array.newInstance(c, 10);

   for (int i = 0; i < 10; i++) {

    Array.set(arrays, i, new Tiger11("bitan" + i));

   }

   Tiger11[] tis = (Tiger11[]) arrays; //强制类型转换

   System.out.println(java.util.Arrays.toString(tis));

   for (int i = 0; i < 10; i++) {

    System.out.println(Array.get(arrays, i));

   }

  } catch (Exception e) {

   e.printStackTrace();

  }

 }

}

[(bitan0), (bitan1), (bitan2), (bitan3), (bitan4), (bitan5), (bitan6), (bitan7), (bitan8), (bitan9)]

(bitan0)

(bitan1)

(bitan2)

(bitan3)

(bitan4)

(bitan5)

(bitan6)

(bitan7)

(bitan8)

(bitan9)

三、利用Java Reflection创建新实例

package tigers;

import java.lang.reflect.*;

public class Tiger9 {

 private String name;

 private int id;

 public Tiger9(String name, int id) {

  this.name = name;

  this.id = id;

 }

 public String toString() {

  return "[" + name + ", " + id + "]";

 }

 public static void main(String[] args) {

  try {

   Class c = Class.forName("tigers.Tiger9");

   Constructor con = c.getDeclaredConstructor(Class.forName("java.lang.String"), int.class);

   Tiger9 t9 = (Tiger9) con.newInstance("bitan", 25);

   System.out.println(t9);

  } catch (Exception e) {

   e.printStackTrace();

  }

 }

}

结果:

[bitan, 25]

四、利用Java Reflection动态获取和改变对象的状态

package tigers;

import java.lang.reflect.*;

public class Tiger10 {

 private int id;

 private String name;

 public Tiger10 (int id, String name) {

  this.id = id;

  this.name = name;

 }

 public String toString() {

  return "[" + name + ", " + id + "]";

 }

 public static void main(String[] args) {

  try {

   Tiger10 t10 = new Tiger10(25, "bitan");

   Class c = Class.forName("tigers.Tiger10");

   Field f = c.getDeclaredField("id");

   Field f2 = c.getDeclaredField("name");

   System.out.println(t10 + " (" + f2.get(t10) + "," + f.getInt(t10) + ")");

   f.setInt(t10, 35);

   f2.set(t10, "helen");

   System.out.println(t10 + " (" + f2.get(t10) + "," + f.getInt(t10) + ")");

  } catch (Exception e) {

   e.printStackTrace();

  }

 }

}

结果:

[bitan, 25] (bitan,25)

[helen, 35] (helen,35)

同一个Tiger10对象的字段在运行中被动态改变。

五、利用Java Reflection执行方法

package tigers;

import java.lang.reflect.*;

public class Tiger8 {

 private int doSomething(String name, int id) {

  System.out.println("[" + name + ", " + id + "]");

  return id + 1000;

 }

 public static void main(String[] args) {

  try {

   Class c = Class.forName("tigers.Tiger8");

   Method me = c.getDeclaredMethod("doSomething", Class.forName("java.lang.String"), int.class);

   Integer result = (Integer) me.invoke(new Tiger8(), "bitan", 25);

   System.out.println(result.intValue());

  } catch (Exception e) {

   e.printStackTrace();

  }

 }

}

结果:

[bitan, 25]

1025

现在将main()中的getDeclaredMethod()改为getMethod(),结果:

java.lang.NoSuchMethodException: tigers.Tiger8.doSomething(java.lang.String, int)

 at java.lang.Class.getMethod(Class.java:1581)

 at tigers.Tiger8.main(Tiger8.java:27)

这是因为getMethod()不能查找到私有方法。