原文出处:http://publish.itpub.net/j/2007-10-17/200710170923968.shtml
在Java中,其反射和动态代理机制极其强大,我们可以通过其反 射机制在运行时获取信息。而代理是一种基本的设计模式,它是一种为了提供额外的或不同的操作而插入到真 实对象中的某个对象。而Java的动态代理在代理上更进一步,既能动态的创建代理对象,又能动态的调用代理 方法。Java的反射和动态代理机制,使Java变得更加强大。
Spring框架这几年风头正劲, 虽然使用者众多,但真正了解其内部实现原理的朋友却并不是很多。其实,了解它的内部实现机制和设计思想 是很有必要的大家都知道,Spring框架的IOC和AOP部分功能强大,很值得我们学习。那么让我们在这两篇文章 中分别详细的学习IOC和AOP的实现吧。
在本文中,主要讲述的是用Java的反射机制实现IOC。下 面,让我们开始IOC之旅吧!
一. Java
反射机制概述与初探
Java的反射机制是Java语言的一个重要特性,Java具有的 比较突出的动态机制就是反射(reflection)。通过它,我们可以获取如下信息:
1) 在运行时判断任意一个对象所属的类;
2) 在运行时获取类的对象;
3) 在运行时获得类所具有的成员变量和方法等 。
下面让我们通过调用一个Java Reflection API的演示实 例来见识一下反射机制的强大。
首先在IDE中建立名为 reflection_proxy的Java工程,并 建立存放源文件的目录src,并在src目录下分别建立org.amigo. reflection目录和org.amigo.proxy目录来分 别存放代理和反射的实例。我们在reflection目录下建立ReflectionTest.java文件,在该文件中编写代码来 演示Java Reflection API的使用。该类的代码如下所示:
package
org.amigo.reflection;
import
java.awt.Button;
import
java.lang.reflect.Method;
import
java.util.Hashtable;
/**
*
初探
Java
的反射机制
.
*
Creation
date:
2007
-
10
-
2
-
上午
10:13:48
*/
public
class
ReflectionTest {
/**
*
@param
args
*/
public
static
void
main(String[] args)
throws
Exception {
ReflectionTest reflection =
new
ReflectionTest();
reflection.getNameTest();
System.
out
.println(
""
);
reflection.getMethodTest();
}
/**
*
Class
的
getName()
方法测试
.
*
@throws
Exception
*/
public
void
getNameTest()
throws
Exception {
System.
out
.println(
"===========begin getNameTest============"
);
String name =
"
阿蜜果
"
;
Class cls = name.getClass();
System.
out
.println(
"String
类名
: "
+ cls.getName());
Button btn =
new
Button();
Class btnClass = btn.getClass();
System.
out
.println(
"Button
类名
: "
+ btnClass.getName());
Class superBtnClass = btnClass.getSuperclass();
System.
out
.println(
"Button
的父类名
: "
+ superBtnClass.getName());
Class clsTest = Class.forName(
"java.awt.Button"
);
System.
out
.println(
"clsTest name: "
+ clsTest.getName());
System.
out
.println(
"===========end getNameTest============"
);
}
/**
*
Class
的
getMethod()
方法测试
.
*
@throws
Exception
*/
public
void
getMethodTest()
throws
Exception {
System.
out
.println(
"===========begin getMethodTest=========="
);
Class cls = Class.forName(
"org.amigo.reflection.ReflectionTest"
);
Class ptypes[] =
new
Class[2];
ptypes[0] = Class.forName(
"java.lang.String"
);
ptypes[1] = Class.forName(
"java.util.Hashtable"
);
Method method = cls.getMethod(
"testMethod"
, ptypes);
Object args[] =
new
Object[2];
args[0] =
"hello, my dear!"
;
Hashtable ht =
new
Hashtable();
ht.put(
"name"
,
"
阿蜜果
"
);
args[1] = ht;
String returnStr = (String) method.invoke(
new
ReflectionTest(), args);
System.
out
.println(
"returnStr= "
+ returnStr);
System.
out
.println(
"===========end getMethodTest=========="
);
}
public
String testMethod(String str, Hashtable ht)
throws
Exception {
String returnStr =
"
返回值
"
;
System.
out
.println(
"
测试
testMethod()
方法调用
"
);
System.
out
.println(
"str= "
+ str);
System.
out
.println(
"
名字
= "
+ (String) ht.get(
"name"
));
System.
out
.println(
"
结束
testMethod()
方法调用
"
);
return
returnStr;
}
}
运行该例,可在控制台看到如下内容:
===========begin getNameTest============
String
类名
: java.lang.String
Button
类名
: java.awt.Button
Button
的父类名
: java.awt.Component
clsTest name: java.awt.Button
===========end getNameTest============
===========begin getMethodTest==========
测试
testMethod()
方法调用
str= hello, my dear!
名字
=
阿蜜果
结束
testMethod()
方法调用
returnStr=
返回值
===========end getMethodTest==========
分析运行结果,我们可以发现,
Java
的反射机制使得我们在运行时能够判断一个对象所属的类,获取对象的方法并得其 进行调用,并获取方法的返回结果等功能。