Java代码
package reflect;
import java.lang.reflect.*;
public class DumpMethods {
private double d;
public static final int i = 37;
String s = "testing";
public DumpMethods() {
}
protected DumpMethods(int i, double d) {
}
public int add(int a, int b) {
return a + b;
}
public static void main(String args) {
try {
Class c = Class.forName("java.lang.String");
// 得到指定类java.lang.String拥有的方法,将它们分别列出来。
Method m = c.getDeclaredMethods();
for (int i = 0; i m.length; i++) {
Method mthod = m[i];
System.out.println(mthod.getName());// 打印方法名
System.out.println(mthod.getDeclaringClass());// 打印方法名
// ...得到参数类型
Class pvec = mthod.getParameterTypes();
for (int j = 0; j pvec.length; j++)
System.out.println("param #" + j + " " + pvec[j]);
// ...得到异常类型
Class evec = mthod.getExceptionTypes();
for (int j = 0; j evec.length; j++)
System.out.println("exc #" + j + " " + evec[j]);
// ...得到返回类型
System.out.println("return type = " + mthod.getReturnType());
System.out.println("-");
// ...System.out.println(m[i].toString());//打印方法名
}
// 获得指定类java.lang.String的构造方法,将它们分别列出来。
Constructor ctorlist = c.getDeclaredConstructors();
for (int i = 0; i ctorlist.length; i++) {
Constructor ct = ctorlist[i];
System.out.println("name = " + ct.getName());
System.out.println("decl class = " + ct.getDeclaringClass());
Class pvec = ct.getParameterTypes();
for (int j = 0; j pvec.length; j++)
System.out.println("param #" + j + " " + pvec[j]);
Class evec = ct.getExceptionTypes();
for (int j = 0; j evec.length; j++)
System.out.println("exc #" + j + " " + evec[j]);
System.out.println("-");
}
// 获取当前类中声明的字段(不包括从基类继承来的字段),若替换成c.getFields,则是获得包括从基类继承的所有字段
Field fieldlist = c.getDeclaredFields();
for (int i = 0; i fieldlist.length; i++) {
Field fld = fieldlist[i];
System.out.println("name = " + fld.getName());
System.out.println("decl class = " + fld.getDeclaringClass());
System.out.println("type = " + fld.getType());
// ...得到修饰符
int mod = fld.getModifiers();
System.out.println("modifiers = " + Modifier.toString(mod));
System.out.println("-");
}
// 根据方法的名称来执行方法
Class partypes = new Class;
partypes[0] = Integer.TYPE;
partypes = Integer.TYPE;
Method meth = c.getMethod("add", partypes);
// ...实例化
DumpMethods methobj = new DumpMethods();
Object arglist = new Object;
arglist[0] = new Integer(37);
arglist = new Integer(47);
Object retobj = meth.invoke(methobj, arglist);
Integer retval = (Integer) retobj;
// ...这里应当返回add方法的结果
System.out.println(retval.intValue());
/*
* 通过调用构造方法来创建新的对象 根据指定的参数类型找到相应的构造函数并执行它,以创建一个新的对象实例。
* 使用这种方法可以在程序运行时动态地创建对象,而不是在编译的时候创建对象,这一点非常有价值。
*/
Constructor ct = c.getConstructor(partypes);
Object retobj1 = ct.newInstance(arglist);
// 改变字段(域)的值
Field fld = c.getField("d");
DumpMethods f2obj = new DumpMethods();
System.out.println("d = " + f2obj.d);
// ...改变值 除了setDouble还有其他很多种
fld.setDouble(f2obj, 12.34);
System.out.println("d = " + f2obj.d);
// 使用数组,创建了 10 个单位长度的 String 数组,为第 5 个位置的字符串赋值
Class cls = Class.forName("java.lang.String");
Object arr = Array.newInstance(cls, 10);
Array.set(arr, 5, "this is a test");
String s = (String) Array.get(arr, 5);
System.out.println(s);
// 数组的另一个复杂点的例子
/*
* 例中创建了一个 5 x 10 x 15 的整型数组,并为处于的元素赋了值为 37。
* 注意,多维数组实际上就是数组的数组,例如,第一个 Array.get 之后,arrobj 是一个 10 x 15 的数组。
* 进而取得其中的一个元素,即长度为 15 的数组,并使用 Array.setInt 为它的第 10 个元素赋值。
* 注意创建数组时的类型是动态的,在编译时并不知道其类型。
*/
int dims = new int { 5, 10, 15 };
Object arr1 = Array.newInstance(Integer.TYPE, dims);
Object arrobj = Array.get(arr1, 3);
Class cls1 = arrobj.getClass().getComponentType();
System.out.println(cls1);
arrobj = Array.get(arrobj, 5);
Array.setInt(arrobj, 10, 37);
int arrcast = (int) arr;
System.out.println(arrcast);
} catch (Throwable e) {
System.err.println(e);
}
}
}
package reflect;
import java.lang.reflect.*;
public class DumpMethods {
private double d;
public static final int i = 37;
String s = "testing";
public DumpMethods() {
}
protected DumpMethods(int i, double d) {
}
public int add(int a, int b) {
return a + b;
}
public static void main(String args) {
try {
Class c = Class.forName("java.lang.String");
// 得到指定类java.lang.String拥有的方法,将它们分别列出来。
Method m = c.getDeclaredMethods();
for (int i = 0; i m.length; i++) {
Method mthod = m[i];
System.out.println(mthod.getName());// 打印方法名
System.out.println(mthod.getDeclaringClass());// 打印方法名
// ...得到参数类型
Class pvec = mthod.getParameterTypes();
for (int j = 0; j pvec.length; j++)
System.out.println("param #" + j + " " + pvec[j]);
// ...得到异常类型
Class evec = mthod.getExceptionTypes();
for (int j = 0; j evec.length; j++)
System.out.println("exc #" + j + " " + evec[j]);
// ...得到返回类型
System.out.println("return type = " + mthod.getReturnType());
System.out.println("-");
// ...System.out.println(m[i].toString());//打印方法名
}
// 获得指定类java.lang.String的构造方法,将它们分别列出来。
Constructor ctorlist = c.getDeclaredConstructors();
for (int i = 0; i ctorlist.length; i++) {
Constructor ct = ctorlist[i];
System.out.println("name = " + ct.getName());
System.out.println("decl class = " + ct.getDeclaringClass());
Class pvec = ct.getParameterTypes();
for (int j = 0; j pvec.length; j++)
System.out.println("param #" + j + " " + pvec[j]);
Class evec = ct.getExceptionTypes();
for (int j = 0; j evec.length; j++)
System.out.println("exc #" + j + " " + evec[j]);
System.out.println("-");
}
// 获取当前类中声明的字段(不包括从基类继承来的字段),若替换成c.getFields,则是获得包括从基类继承的所有字段
Field fieldlist = c.getDeclaredFields();
for (int i = 0; i fieldlist.length; i++) {
Field fld = fieldlist[i];
System.out.println("name = " + fld.getName());
System.out.println("decl class = " + fld.getDeclaringClass());
System.out.println("type = " + fld.getType());
// ...得到修饰符
int mod = fld.getModifiers();
System.out.println("modifiers = " + Modifier.toString(mod));
System.out.println("-");
}
// 根据方法的名称来执行方法
Class partypes = new Class;
partypes[0] = Integer.TYPE;
partypes = Integer.TYPE;
Method meth = c.getMethod("add", partypes);
// ...实例化
DumpMethods methobj = new DumpMethods();
Object arglist = new Object;
arglist[0] = new Integer(37);
arglist = new Integer(47);
Object retobj = meth.invoke(methobj, arglist);
Integer retval = (Integer) retobj;
// ...这里应当返回add方法的结果
System.out.println(retval.intValue());
/*
* 通过调用构造方法来创建新的对象 根据指定的参数类型找到相应的构造函数并执行它,以创建一个新的对象实例。
* 使用这种方法可以在程序运行时动态地创建对象,而不是在编译的时候创建对象,这一点非常有价值。
*/
Constructor ct = c.getConstructor(partypes);
Object retobj1 = ct.newInstance(arglist);
// 改变字段(域)的值
Field fld = c.getField("d");
DumpMethods f2obj = new DumpMethods();
System.out.println("d = " + f2obj.d);
// ...改变值 除了setDouble还有其他很多种
fld.setDouble(f2obj, 12.34);
System.out.println("d = " + f2obj.d);
// 使用数组,创建了 10 个单位长度的 String 数组,为第 5 个位置的字符串赋值
Class cls = Class.forName("java.lang.String");
Object arr = Array.newInstance(cls, 10);
Array.set(arr, 5, "this is a test");
String s = (String) Array.get(arr, 5);
System.out.println(s);
// 数组的另一个复杂点的例子
/*
* 例中创建了一个 5 x 10 x 15 的整型数组,并为处于的元素赋了值为 37。
* 注意,多维数组实际上就是数组的数组,例如,第一个 Array.get 之后,arrobj 是一个 10 x 15 的数组。
* 进而取得其中的一个元素,即长度为 15 的数组,并使用 Array.setInt 为它的第 10 个元素赋值。
* 注意创建数组时的类型是动态的,在编译时并不知道其类型。
*/
int dims = new int { 5, 10, 15 };
Object arr1 = Array.newInstance(Integer.TYPE, dims);
Object arrobj = Array.get(arr1, 3);
Class cls1 = arrobj.getClass().getComponentType();
System.out.println(cls1);
arrobj = Array.get(arrobj, 5);
Array.setInt(arrobj, 10, 37);
int arrcast = (int) arr;
System.out.println(arrcast);
} catch (Throwable e) {
System.err.println(e);
}
}
}
本文深入探讨Java反射API的使用方法,展示了如何通过反射获取类的方法、构造器和字段信息,并演示了动态创建对象及调用方法的过程。
1188

被折叠的 条评论
为什么被折叠?



