`
mywayscut
  • 浏览: 25402 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java反射 测试代码

阅读更多

代码整理自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标准库的`java.lang.reflect`包开始,研究Class、Constructor、Method和Field类的实现。通过阅读源码,可以更深入地理解反射的工作原理,提升...

    Java反射性能测试分析

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的应用场景下可能成为一个瓶颈。本文将深入...

    Java反射示例代码.rar

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。...提供的"Java反射示例代码.rar"资源正好可以帮助初学者通过实践来理解这些概念。

    JAVA反射机制的入门代码

    总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...

    Java 反射机制 代码的实例

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...

    java反射 java反射 java反射java反射

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...

    JAVA反射机制自定义框架测试代码

    本篇文章将深入探讨Java反射机制,并通过自定义框架的测试代码来进一步理解其应用。 首先,我们需要了解什么是反射。在Java中,反射是指在运行时,程序可以获取类、接口、字段和方法的信息,并且能够调用这些方法,...

    java反射调用实例代码

    这个资源“java反射调用实例代码”提供了关于如何使用Java反射API进行各种操作的实际示例。 在Java中,`java.lang.reflect`包提供了对反射的支持,包括`Class`类,`Constructor`类,`Method`类和`Field`类。这些类...

    java反射机制文档及代码

    在实际开发中,Java反射机制广泛应用于框架设计、插件系统、动态代理、序列化、测试工具等多个领域。然而,反射使用不当也可能带来性能问题和安全风险,因此需谨慎使用。 通过阅读"1139760298222java.pdf"这份文档...

    java r反射源代码

    Java反射是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法的信息。在Java中,反射是通过java.lang.reflect包提供的类和接口实现的,这些工具允许我们动态地访问类的私有成员、...

    java反射,获取所有属性、方法以及List集合类

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...

    Java反射机制的实现_Reflection

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    java面试题--反射机制

    掌握Java反射机制对于开发者来说是非常有价值的,尤其是在开发框架、自动化测试等方面的应用。 #### 十、参考资料 - [Oracle官方文档](https://docs.oracle.com/javase/tutorial/reflect/) - [Effective Java]...

    Java反射经典实例

    Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...

    java反射机制+代码示例

    Java反射机制是Java编程语言中...通过实际的代码示例,学习和理解Java反射机制将变得更加直观和深入。在实际开发中,反射常用于框架、插件系统、序列化/反序列化、测试等方面,但也需要谨慎使用,避免过度依赖和滥用。

    java反射-英文版反射规范

    Java反射广泛应用于框架开发、动态代理、测试工具等领域。例如,在Spring框架中,反射被用来动态创建对象和调用方法;在Hibernate等ORM框架中,反射用于处理数据库记录与Java对象之间的映射关系。 #### 三、反射...

    JAVA 反射机制应用

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...

    java 反射机制例子

    Java反射的核心功能之一就是能够检测类的信息。下面通过一个具体的示例来展示如何使用Java反射来获取类的详细信息: ```java import java.lang.reflect.*; public class DumpMethods { public static void main...

    java反射机制测试代码

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法的信息。这种能力使得Java代码能够具备高度的动态性,能够在不预先知道具体类的情况下,调用类的方法,访问字段,...

Global site tag (gtag.js) - Google Analytics