没有合适的资源?快使用搜索试试~ 我知道了~
利用Java的反射与代理实现IOC模式
5星 · 超过95%的资源 需积分: 16 416 下载量 65 浏览量
2012-11-22
08:15:08
上传
评论 15
收藏 86KB DOC 举报
温馨提示
试读
11页
利用Java的反射与代理实现IOC模式 在Java中,其反射和动态代理机制极其强大,我们可以通过其反 射机制在运行时获取信息。而代理是一种基本的设计模式,它是一种为了提供额外的或不同的操作而插入到真 实对象中的某个对象。而Java的动态代理在代理上更进一步,既能动态的创建代理对象,又能动态的调用代理 方法。Java的反射和动态代理机制,使Java变得更加强大。 Spring框架这几年风头正劲, 虽然使用者众多,但真正了解其内部实现原理的朋友却并不是很多。其实,了解它的内部实现机制和设计思想 是很有必要的大家都知道,Spring框架的IOC和AOP部分功能强大,很值得我们学习。那么让我们在这两篇文章 中分别详细的学习IOC和AOP的实现吧。 在本文中,主要讲述的是用Java的反射机制实现IOC。下 面,让我们开始IOC之旅吧!
资源推荐
资源详情
资源评论
在 Java 中,其反射和动态代理机制极其强大,我们可以通过其反 射机制在运行时获取信息。
而代理是一种基本的设计模式,它是一种为了提供额外的或不同的操作而插入到真 实对象中的
某个对象。而 Java 的动态代理在代理上更进一步,既能动态的创建代理对象,又能动态的调用
代理 方法。Java 的反射和动态代理机制,使 Java 变得更加强大。
Spring 框架这几年风头正劲, 虽然使用者众多,但真正了解其内部实现原理的朋友却并
不是很多。其实,了解它的内部实现机制和设计思想 是很有必要的大家都知道,Spring 框架
的 IOC 和 AOP 部分功能强大,很值得我们学习。那么让我们在这两篇文章 中分别详细的学习
IOC 和 AOP 的实现吧。
在本文中,主要讲述的是用 Java 的反射机制实现 IOC。下 面,让我们开始 IOC 之旅吧!
一. Java 反射机制概述与初探
Java 的反射机制是 Java 语言的一个重要特性,Java 具有的 比较突出的动态机制就是反射
(reection)。通过它,我们可以获取如下信息:
1) 在运行时判断任意一个对象所属的类;
2) 在运行时获取类的对象;
3) 在运行时获得类所具有的成员变量和方法等 。
下面让我们通过调用一个 Java Reection API 的演示实 例来见识一下反射机制的强大。
首先在 IDE 中建立名为 reection_proxy 的 Java 工程,并 建立存放源文件的目录 src,
并在 src 目录下分别建立 org.amigo. reection 目录和 org.amigo.proxy 目录来分 别存放
代理和反射的实例。我们在 reection 目录下建立 ReectionTest.java 文件,在该文件中编
写代码来 演示 Java Reection API 的使用。该类的代码如下所示:
package org.amigo.reection;
import java.awt.Button;
import java.lang.reect.Method;
import java.util.Hashtable;
/**
*初探 Java 的反射机制.
*@author<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
*Creationdate:2007-10-2-上午 10:13:48
*/
Public class ReectionTest {
/**
*@paramargs
*/
public static void main(String[] args) throws Exception {
ReectionTest reection = new ReectionTest();
reection.getNameTest();
System.out.println("");
reection.getMethodTest();
}
/**
*Class 的 getName()方法测试.
*@throwsException
*/
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()方法测试.
*@throwsException
*/
Public void getMethodTest() throws Exception {
System.out.println("===========begin
getMethodTest==========");
Class cls = Class.forName("org.amigo.reection.ReectionTest");
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<String, String> ht = new Hashtable<String, String>();
ht.put("name", "阿蜜果");
args[1] = ht;
String returnStr = (String) method.invoke(new ReectionTest(), 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 的反射机制使得我们在运行时能够判断一个对象
所属的类,获取对象的方法并得其 进行调用,并获取方法的返回结果等功能。
二、 IOC 使用的背景
在我们日常的设计中,类与类之间存在着千丝万缕的关系,如果两个类存在着强耦合关系,
那么在维护时,一个类的修改很可能会牵动另一个类的关联修改,从而使得我们的维护工作步
履维艰。下面让我们来看这样的一个强耦合反面例子。
首先我们建立一个 Chinese.java 类,该类的 sayHelloWorld(String name)方法,用中
文对名为 name 的人问好,其内容如下:
package org.amigo.reection;
/**
*中国人类.
*@author<a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
*Creationdate:2007-10-2-上午 10:37:17
*/
publicclass Chinese {
剩余10页未读,继续阅读
lx76939412
- 粉丝: 261
- 资源: 396
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页