一、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()不能查找到私有方法。