`
緣自秋淚
  • 浏览: 11759 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

浅谈Java动态反射

 
阅读更多

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

什么是反射,简单地说,就是在程序运行是来检查已知名称的Class中的内部信息,那么动态和反射又是什么关系呢。从某种程度上讲,动态是依靠反射来实现的。

以上简单的文字描述应该已经可以为动态与反射下个粗略的定义,让人了解大概是个什么东东。接下来更进一步具体分析,就得来看看简单的代码示例。

这是静态绑定的情况: 

 

// 静态编译/静态绑定
		IVehicle vehicle = new BMW();
		vehicle.forward(100);

 

这种情况不必多说,下面来看看动态绑定的情况:

 

// 动态编译/绑定/运行时多态
		// 1.载入类对象
		Class c = Class.forName("ref.BMW");
		// 2.调用默认无参构造器生成对象
		Object object = c.newInstance();
		// 3.强制转型
		IVehicle ve = (IVehicle) object;
		ve.forward(500);

 

 从这里我们就来看动态绑定和静态绑定之间的区别。静态绑定在编译的过程中就会进行检验,假设找不到BMW这个类,编译就会出错。而动态绑定的时候,如果找不到这个类,是否也会出错呢?答案是否定的,这个时候是能够通过编译的。但是在运行时,会抛出一个ClassNotFoundException

那么反射又是怎么一会事呢,简单的说就是根据类名得到类的内部信息。下面就是反射的一些简单代码示例。

 

// 得到类名
		String className = c.getName();
		System.out.println("className:" + className);

		// 得到类中的方法对象数组
		java.lang.reflect.Method[] methods = c.getMethods();
		for (int i = 0; i < methods.length; i++) {
			System.out.println("methods:" + methods[i].getName());
		}

		// 得到类定义的构造对象数组
		java.lang.reflect.Constructor[] cons = c.getConstructors();
		for (int i = 0; i < cons.length; i++) {
			System.out.println("cons:" + cons[i].getName());
		}

		// 得到类定义的属性对象数组
		java.lang.reflect.Field[] fields = c.getFields();
		for (int i = 0; i < fields.length; i++) {
			System.out.println("fields:" + fields[i].getName());
		}

		// 得到类的直接父类对象
		Class superClass = c.getSuperclass();
		System.out.println("superClass:" + superClass.getName());

		// 得到类所有实现的接口类对象数组
		Class[] interfaces = c.getInterfaces();
		for (int i = 0; i < interfaces.length; i++) {
			System.out.println("interfaces:" + interfaces[i].getName());
		}

  

下面来看看输出。

 

classNameref.BMW

methods:forward

methods:startMe

methods:getEnergy

methods:wait

methods:wait

methods:wait

methods:hashCode

methods:getClass

methods:equals

methods:toString

methods:notify

methods:notifyAll

cons:ref.BMW

cons:ref.BMW

fields:company

fields:energy

superClass:java.lang.Object

interfaces:ref.IVehicle

 

 

这就是所谓的反射了。当然,这里只是列举了一小部分,反射的功能远非这些,其应用和所带来的便利也不是一下子能说尽的。这里只是作为一个菜鸟对动态和反射提出了一些自己的理解罢了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics