`
wxq594808632
  • 浏览: 262889 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java反射浅析

    博客分类:
  • java
阅读更多
在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。

Java 反射机制主要提供了以下功能:

在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法


Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection API取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Serializable),也包括fields和methods的所有信息,并可于运行时改变fields内容或调用methods

在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中
Class类:代表一个类。
Field 类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor 类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法


先看一个简单的例子


package com.smallq.reflection;

import java.lang.reflect.Method;

/**
 * 最简反射示例
 * 
 * @author smallq
 * 
 */
public class ShowMethods {

	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		// 根据完整的类名得到对象的类型
		Class<?> classType = Class.forName("java.util.Date");
		// 取对象的所有方法
		Method method[] = classType.getDeclaredMethods();
		// 输出
		for (int i = 0; i < method.length; i++) {
			System.out.println(method[i].toString());
		}
	}

}




上面的例子是给定一个完整的类名。然后就可以知道所有这个类中的公共方法
那么怎么调用类中的方法呢。看下面的例子

package com.smallq.reflection;
import java.lang.reflect.Method;

/**
 * 反射例子
 * 
 * @author smallq
 * 
 */
public class InvokeTester {
	public int add(int a, int b) {
		return a + b;
	}

	public String echo(String str) {
		return "echo: " + str;
	}

	public static void main(String[] args) throws Exception, Exception {

		// 得到对象类型
		Class<?> classType = InvokeTester.class;
		// 根据类型实例化对象,这里使用newInstance方法只能实例化具有无参构造方法的对象
		Object invokeTester = classType.newInstance();
		/**
		 * 如果类提供了有参构造方法.则使用下面的方法得到实例,有参则在下面两个大括号中写 new Class.和new Object是对应的
		 */

		// Object invokeTester = classType.getConstructor(new
		// Class[]{}).newInstance(new Object[]{});
		// 取对象的方法(方法名,方法参数的类型)
		Method addMethod = classType.getMethod("add", new Class[] { int.class,
				int.class });
		// 调用InvokeTester对象的add()方法
		// 提供参数(对象的实例,方法需要的参数)方法参数必须是类类型.不能是基本类型.但是jdk1.5提供了自动装箱.所以int也可以
		Object result = addMethod.invoke(invokeTester, new Object[] {
				new Integer(100), 400 });
		System.out.println(result.toString());

		/**
		 * 同理
		 */
		Method echoMethod = classType.getMethod("echo",
				new Class[] { String.class });
		Object object = echoMethod.invoke(invokeTester, "Hello");
		System.out.println(object.toString());
	}
}


jkd提供了invoke方法调用对象的方法

在java.lang.Object 类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。Class类是Reflection API 中的核心类,它有以下方法
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法


如果想反射一个类。那么必须知道他的类类型。也就是class object
一共有如下几种方法

1)getClass()                //String str="aaa"; 
                             //Class c=str.getClass();
2)静态方法 
Class.forName();            //Class c=Class.forName("java.lang.String");

3).class语法                //Class c=String.class

4)原声数据类型的type语法    //Boolean.TYPE

5)getSupperclass            //String str="aaa";
                            //Class c=str.getSuperclass(); 得到的是object类的类型



分享到:
评论

相关推荐

    Java 反射机制浅析

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于,它打破了编译时的束缚,使得代码具有更高的灵活性和可扩展性。在Java中,反射主要依赖于`...

    浅析Java 反射机制的用途和缺点

    "浅析Java 反射机制的用途和缺点" Java 反射机制是一种强大的技术,可以让应用程序做一些几乎不可能做到的事情。它可以让程序在运行时检测或修改程序行为,是 Java 语言中一个相对高级的特性。开发者可以使用反射...

    深入浅析Java反射机制

    Java反射机制是Java编程语言中一个强大的工具,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于,它打破了程序编译时的静态性,提供了对类、接口、字段和方法的动态访问能力。通过反射,...

    Java反射机制(Reflection)浅析

    Java反射机制(Reflection)是Java语言提供的一种强大的能力,它允许程序在运行时动态地获取类的信息并操作类的对象。这种机制使得Java具备了高度的灵活性和动态性,尤其是在处理未知类或者需要根据条件动态调用类的...

    浅析Java泛型的使用.pdf

    这意味着在运行时,你无法通过反射获取到如List&lt;String&gt;.class这样的泛型类实例。例如,List和List在运行时实际上是相同的类,都变成了List。类型擦除使得泛型在运行时无法直接检测,但编译时的类型检查仍然确保了...

    Java基础知识点 - 内容比较全面

    7. **Java中的反射机制**:反射允许程序在运行时检查类、接口、字段和方法的信息,动态创建对象并调用方法。它是Java动态性的重要体现,广泛应用于插件系统、框架和测试工具。 8. **Java中Heap与Stack的区别**:堆...

    java与php的区别浅析

    Java与PHP的区别浅析 Java是一种通用的面向对象编程语言,旨在生成可在任何地方使用相同代码的代码。这种编程语言是基于类的,面向对象的和人类可读的。它支持服务器端和客户端。Java既可以编译也可以解释。Java...

    深入浅析Java注解框架

    Java注解框架是Java编程语言中的一个重要特性,它允许开发者在代码中添加元数据,以提供额外的信息,如编译器指令、运行时检查或框架的配置信息。注解的本质是与程序代码关联的特殊标记,它们在编译时或运行时通过...

    Android框架浅析之锁屏(Keyguard)机制原理

    ### Android框架浅析之锁屏(Keyguard)机制原理 #### 一、锁屏界面的组成 锁屏(Keyguard)是Android系统中的一个重要组成部分,它主要用于保护用户的隐私数据不被未授权访问。锁屏功能主要由两个部分组成:解锁...

    XML架构浅析.pdf

    在现代编程环境中,如.NET Framework和Java,反射扮演着重要角色。它可以减少开发者必须考虑的问题数量,并且使得创建更高效的工具变得可能。例如,在.NET Framework中,公共语言运行时(CLR)提供了安全、垃圾回收...

    浅析java中 Spring MVC 拦截器作用及其实现

    1. **依赖关系**:拦截器是基于Spring框架,依赖于反射机制,仅能处理请求;而过滤器基于Servlet规范,通过回调函数实现,过滤范围更广,可以处理请求和响应。 2. **控制流程**:拦截器可以决定是否继续处理请求,...

    JFinal技术架构浅析.doc

    JFinal 是一个基于Java语言的轻量级Web开发框架,其设计目标是简化开发、提高效率,让开发者能够更专注于业务逻辑的实现。本篇文档将对JFinal的技术架构进行浅析,帮助读者理解其核心设计理念和工作原理。 1. **...

    Java动态代理简单应用

    概念  代理模式是基本的设计模式之一,它是开发者为了提供额外的或...  Java动态代理实现机制采用了反射的思想,有关于反射的基础知识,可以参见博客Java发射机制浅析。  原理  Spring核心AOP实现技术之一是采用

    java中hashcode()和equals()的详解.docx

    #### `hashCode()`方法浅析 `hashCode()`方法是`Object`类中的一个方法,用于生成对象的哈希码。这个哈希码通常是一个整数值,用来表示对象的一个简短标识符。Java利用哈希码来提高查找对象的速度,尤其是在集合框架...

    浅析道路检测技术的要点及应用.docx

    本文将浅析当前几种主流的道路检测技术要点及其应用情况。 首先,探地雷达技术(GPR)是近年来广泛应用于道路检测的技术之一。它通过发射电磁波并接收其在地下介质中传播的回波,从而识别和评估路面下方结构的状况...

    JNI资源汇总

    - **类和结构体**:JNI支持对Java类的反射操作,以及将Java对象映射到C/C++的结构体。 5. **学习资源**: - "Android JNI开发入门与提高":这份文档可能涵盖了JNI的基础知识,如如何创建和调用本地方法,以及进阶...

    浅析使用JDBC操作MySQL需要添加Class.forName("com.mysql.jdbc.Driver")

    2. 通过反射调用类的方法。 3. 初始化子类时,如果父类尚未初始化,会先初始化父类。 4. JVM启动时,初始化指定的主类。 `Class.forName()`方法在Java官方文档中被描述为在运行时动态加载一个类并返回`Class`对象。...

Global site tag (gtag.js) - Google Analytics