代码整理自http://dev.csdn.net/article/49/49876.shtm
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[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
Method meth = c.getMethod("add", partypes);
// ...实例化
DumpMethods methobj = new DumpMethods();
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = 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 的整型数组,并为处于 [3][5][10] 的元素赋了值为 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[3][5][10]);
} catch (Throwable e) {
System.err.println(e);
}
}
}
分享到:
相关推荐
对于学习Java反射,阅读和理解相关的源代码是非常有益的。你可以从Java标准库的`java.lang.reflect`包开始,研究Class、Constructor、Method和Field类的实现。通过阅读源码,可以更深入地理解反射的工作原理,提升...
Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的应用场景下可能成为一个瓶颈。本文将深入...
Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。...提供的"Java反射示例代码.rar"资源正好可以帮助初学者通过实践来理解这些概念。
总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...
Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...
本篇文章将深入探讨Java反射机制,并通过自定义框架的测试代码来进一步理解其应用。 首先,我们需要了解什么是反射。在Java中,反射是指在运行时,程序可以获取类、接口、字段和方法的信息,并且能够调用这些方法,...
这个资源“java反射调用实例代码”提供了关于如何使用Java反射API进行各种操作的实际示例。 在Java中,`java.lang.reflect`包提供了对反射的支持,包括`Class`类,`Constructor`类,`Method`类和`Field`类。这些类...
在实际开发中,Java反射机制广泛应用于框架设计、插件系统、动态代理、序列化、测试工具等多个领域。然而,反射使用不当也可能带来性能问题和安全风险,因此需谨慎使用。 通过阅读"1139760298222java.pdf"这份文档...
Java反射是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法的信息。在Java中,反射是通过java.lang.reflect包提供的类和接口实现的,这些工具允许我们动态地访问类的私有成员、...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...
### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...
掌握Java反射机制对于开发者来说是非常有价值的,尤其是在开发框架、自动化测试等方面的应用。 #### 十、参考资料 - [Oracle官方文档](https://docs.oracle.com/javase/tutorial/reflect/) - [Effective Java]...
Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...
Java反射机制是Java编程语言中...通过实际的代码示例,学习和理解Java反射机制将变得更加直观和深入。在实际开发中,反射常用于框架、插件系统、序列化/反序列化、测试等方面,但也需要谨慎使用,避免过度依赖和滥用。
Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...
Java反射的核心功能之一就是能够检测类的信息。下面通过一个具体的示例来展示如何使用Java反射来获取类的详细信息: ```java import java.lang.reflect.*; public class DumpMethods { public static void main...
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法的信息。这种能力使得Java代码能够具备高度的动态性,能够在不预先知道具体类的情况下,调用类的方法,访问字段,...