`
lggege
  • 浏览: 375498 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

举例解析Java的反射机制

    博客分类:
  • Java
阅读更多
  • 1. 使用反射得到对象的属性. 注: 属性的使用,同样也受private,public等作用域的限制.

public class FieldClass {
	public String publicField = "ss"; // public 属性
	private Double privateField = new Double(22.22); // private 属性
	public static Boolean staticField = true; // static 属性
}


import java.lang.reflect.Field;
import junit.framework.TestCase;

public class FieldTestCase extends TestCase {
	public void testField() throws Exception {
		FieldClass test = new FieldClass();

		Field field1 = FieldClass.class.getField("publicField");
		assertEquals(field1.get(test), test.publicField); // 能够使用test.intPublicField,则也可以使用反射得到值

		try {
			Field field2 = FieldClass.class.getField("privateField");
		} catch (Exception e) {
			assertTrue(e instanceof java.lang.NoSuchFieldException); // 由于doubleField是private的, 不可被外部直接调用
		}

		Field field3 = FieldClass.class.getField("staticField");
		assertTrue((Boolean) field3.get(FieldClass.class));
	}
}


  • 2. 使用反射得到对象的无参方法.

public class MethodClass {
	public String publicMehod() {
		return "public";
	}
	
	private String privateMethod() {
		return "private";
	}
	
	public static String staticMethod() {
		return "static";
	}
}

import java.lang.reflect.Method;
import junit.framework.TestCase;

public class MethodTestCase extends TestCase {
	public void testMethod() throws Exception {
		MethodClass test = new MethodClass();

		Method method1 = MethodClass.class.getMethod("publicMehod", new Class[] {});
		assertEquals(method1.invoke(test, new Object[] {}), "public");

		try {
			Method method2 = MethodClass.class.getMethod("privateMethod", new Class[] {});
		} catch (Exception e) {
			assertTrue(e instanceof NoSuchMethodException);
		}

		Method method3 = MethodClass.class.getMethod("staticMethod", new Class[] {});
		assertEquals(method3.invoke(MethodClass.class, new Object[] {}), "static");
	}
}



  • 3. 使用反射得到对象的有参方法.

public class ArguementMethodClass {
	public String methodWithNoArguement() {
		return "no";
	}
	
	public String methodWithOneArgument(String arg) {
		return "one";
	}
	
	public String methodWithTwoArguments(String arg0, String arg1) {
		return "two";
	}
	
	public String methodWithArrayArguments(String[] argArray) {
		return "array";
	}
	
	public String methodWithMoreArguments(String... args) {
		return "more";
	}
}

import java.lang.reflect.Method;
import junit.framework.TestCase;

public class ArgumentMethodTestCase extends TestCase {
	public void testArgumentMethod() throws Exception {
		ArguementMethodClass test = new ArguementMethodClass();

		Method method1 = ArguementMethodClass.class.getMethod("methodWithNoArguement", new Class[] {});
		method1.invoke(test, new Object[] {});

		Method method2 = ArguementMethodClass.class.getMethod("methodWithOneArgument", new Class[] { String.class });
		assertEquals(method2.invoke(test, new Object[] { "aa" }), "one");

		Method method3 = ArguementMethodClass.class.getMethod("methodWithTwoArguments", new Class[] { String.class, String.class });
		assertEquals(method3.invoke(test, new Object[] { "aa", "bb" }), "two");

		Method method4 = ArguementMethodClass.class.getMethod("methodWithArrayArguments", new Class[] { String[].class });
		assertEquals(method4.invoke(test, new Object[] { new String[] { "aa" } }), "array");

		Method method5 = ArguementMethodClass.class.getMethod("methodWithMoreArguments", new Class[] { String[].class });
		assertEquals(method5.invoke(test, new Object[] { new String[] { "aa" } }), "more");
	}
}


  • 4. 重载的处理.

public class OverloadMethodClass {
	public String sameMethod() {
		return "one";
	}
	
	public String sameMethod(String arg) {
		return "two";
	}
}
import java.lang.reflect.Method;
import junit.framework.TestCase;

public class OverloadMthodTestCase extends TestCase {
	public void testOverrideMethod() throws Exception {
		OverloadMethodClass test = new OverloadMethodClass();

		Method method1 = OverloadMethodClass.class.getMethod("sameMethod", new Class[] {});
		assertEquals(method1.invoke(test, new Object[] {}), "one");

		Method method2 = OverloadMethodClass.class.getMethod("sameMethod", new Class[] { String.class });
		assertEquals(method2.invoke(test, new Object[] { "aa" }), "two");
	}
}
  • reflect.rar (2.5 KB)
  • 描述: 上面涉及到的代码,可以下载.
  • 下载次数: 44
分享到:
评论

相关推荐

    Java反射技术原理与用法实例分析

    Java反射技术是Java语言中的一种动态语言技术,能够在运行时解析外部对象的信息。通过反射技术,可以动态地获取类以及类中的成员,并可以调用该类成员。 产生反射技术的需求: 在项目完成以后,发现需要增加功能,...

    java常用API举例

    8. **反射机制**:Java反射允许程序在运行时检查类、接口、字段和方法的信息,并能动态创建对象和调用方法。例如: ```java Class<?> clazz = Class.forName("java.util.ArrayList"); Object instance = clazz.new...

    java反射总结实例详解

    本文将深入探讨Java反射的概念,通过实例解析如何使用反射来获取对象属性值,并介绍Class类、基本数据类型以及类的反射。 首先,`Class`类在Java中扮演着核心角色。每一个类在Java中都是`Class`类型的实例,这种...

    java面试经验解析.zip

    以下是一些基于“Java面试经验解析.zip”文件内容的关键知识点的详细说明: 1. **基础知识**:Java面试通常会从基础开始,涵盖语法、数据类型、运算符、流程控制语句(如if-else、switch-case、for、while等)。...

    第16章 反射2

    【Java反射机制详解】 在Java编程语言中,反射是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段以及方法等元数据。在第16章中,我们将深入探讨Java类加载、连接和初始化的过程,以及反射的相关概念。...

    10道腾讯的Java面试题答案.zip

    - 题目:说明Java反射机制的作用和应用场景。 - 答案:反射允许在运行时动态获取类信息,创建和操作对象,实现动态代理,便于实现插件化或框架设计。 7. **设计模式** - 题目:举例说明单例模式的实现方式及其优...

    java基础工具类iceroot

    java基础工具类iceroot iceroot是一个java基础工具类....包含的方法举例: 字符串截取 驼峰下划线互转 执行命令行 反射调用方法 集合操作 日期格式化与解析 时分秒转换 uuid生成 常用的常量 执行sql

    java面试题&&java面试题

    以下是一些常见的Java面试题目以及相关的知识点解析: 1. **基础语法与数据类型** - Java中的基本数据类型有哪些?它们各自占用的内存大小是多少? - 介绍Java中的引用数据类型,如类、接口、数组。 - 解释自动...

    java技术面试题目及答案

    - **Q:** Java反射机制能做什么? - **A:** 反射允许运行中的Java程序获取类的信息(如类名、方法、字段),并在运行时创建和调用类的对象,增强了代码的灵活性和动态性。 9. **IO流** - **Q:** 什么是字节流和...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.83.docx

    解析:反射为Java提供了强大的元数据操作能力,但在使用时需谨慎,因为它可能导致程序的运行效率降低和安全性问题。问题 10:请解释一下 Java 中的异常处理机制,以及 try-catch-finally 语句块的作用?答案:Java ...

    java面试题

    66. 反射机制 49 66.1.1. 传统的类型转换。 49 66.1.2. 通过Class对象来获取对象的类型。 49 66.1.3. 通过关键字instanceof或Class.isInstance()方法 49 67. 说出一些常用的类,包,接口,请各举5个 50 68. XML文档...

    重难点之JavaAnnotation手册.pdf

    定义是创建Annotation类型,解析是通过Java反射API获取并使用Annotation信息。 - Annotation处理器是工具,如Java的apt工具,它可以扫描源代码中的Annotation,并根据开发者定义的规则执行相应的操作,如验证、代码...

    华为java面试题

    ### 华为Java面试题知识点解析 #### 一、Java面向对象基础 1. **super()与this()的区别** - `super()`用于调用父类的构造方法或父类中的成员方法。 - `this()`用于调用本类中的其他构造方法。 2. **作用域public...

    java面试题题库详解

    Java反射机制 **知识点概述:** - **Class 对象:** 获取类的信息。 - **Field、Method、Constructor:** 操作类的成员变量、方法和构造函数。 #### 40. Web.xml 文件的作用 **知识点概述:** - **配置信息:** ...

    笔试面试(复习资料大全)Java笔试题_20071220.doc

    本文将根据提供的部分内容,深入解析Java笔试题中的关键知识点,帮助读者巩固基础,提升技能。 1. **HashMap与HashTable的区别** - HashMap是非线程安全的实现,它是Hashtable的轻量级版本,效率相对较高。 - ...

    自己实现ioc实例demo

    这通常需要利用Java的反射API,例如`Field`的`set()`方法。 5. **初始化对象**:如果类有特定的初始化方法(如`init()`),可以调用这些方法完成对象的初始化。 在实际开发中,IoC容器如Spring框架已经提供了强大的...

    shouhu 面试 java 比较全的题目.docx

    - **反射机制**:如何通过反射创建对象、调用方法和访问字段。 - **注解的使用**:自定义注解,以及注解处理器的工作原理。 10. **Spring框架** - **依赖注入**:理解DI的原理,以及@Autowired和@Resource的异同...

    java面试题-应届生面试题-面试大全

    下面将根据标题、描述以及标签,详细解析可能出现在Java求职面试中的关键知识点。 1. **Java基础** - **数据类型与变量**:了解基本数据类型(整型、浮点型、字符型、布尔型)及其作用,理解引用数据类型如类、...

    java面试宝典

    - `super.getClass()`用于获取父类的`Class`对象,可以通过反射机制获取类的信息。 **知识点31:String是最基本的数据类型吗?** - `String`不是基本数据类型,它是Java中的一个类,用于表示文本。 **知识点32:...

Global site tag (gtag.js) - Google Analytics