IOC基于Java底层的反射机制实现
反射机制:
核心:
Class cls = Class.forName(类名); 
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); 

如何知道参数类型数量:
Method []m= cls.getMethods(); 
if(m!=null &&m.length>0) 

    for (int i = 0; i < m.length; i++) { 
        if(m[i].getName().equals("testMethod")){ 
            Parameter []p=m[i].getParameters(); 
            if(p!=null && p.length>0) 
              { 
                    for (Parameter parameter : p) { 
                    System.out.println(parameter.getType().getName()); 
                } 
            } 
        } 
    } 

如何调用:
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 ReflectionTest(), args); 
System.out.println("returnStr= " + returnStr); 

例子:
package com.gillion.javaReflection;

import java.awt.Button; 
import java.lang.reflect.Method; 
import java.lang.reflect.Parameter; 
import java.util.Hashtable; 
/** 
* @Description Java的反射机制 
* @author huyuangui@aliyun.com 
* @time 2015年1月8日 下午4:53:24 
* @version 1.0.0 
*/ 
public class ReflectionTest {

/** 
* 入口 
* @param args 
* @throws Exception 
*/ 
public static void main(String[] args) throws Exception { 
ReflectionTest reflection = new ReflectionTest(); 
reflection.getNameTest(); 
System.out.println(""); 
reflection.getMethodTest(); 
}

/** 
* 获取类名 全路径 
* @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============"); 
}

public void getMethodTest() throws Exception { 
System.out.println("===========begin getMethodTest=========="); 
Class cls = Class.forName("com.gillion.javaReflection.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); 
/*** 
* 需要注入哪些参数,参数类型是什么,有多少个参数 
*/ 
Method []m= cls.getMethods(); 
if(m!=null &&m.length>0) 

for (int i = 0; i < m.length; i++) { 
if(m[i].getName().equals("testMethod")){ 
Parameter []p=m[i].getParameters(); 
if(p!=null && p.length>0) 

for (Parameter parameter : p) { 
System.out.println(parameter.getType().getName()); 





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 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; 

 
 

(满满的是硬货)Spring深入研究一IOC实现的更多相关文章

  1. spring源码浅析——IOC

    =========================================== 原文链接: spring源码浅析--IOC   转载请注明出处! ======================= ...

  2. spring jpetstore研究入门(zz)

    spring jpetstore研究入门 分类: java2008-12-21 23:25 561人阅读 评论(2) 收藏 举报 springstrutsibatissearchweb框架servle ...

  3. spring(一)IOC & AOP

    参考文档: spring详解:http://www.cnblogs.com/ysocean/p/7466191.html(可以说非常详细了) aop源码详解:https://www.cnblogs.c ...

  4. spring.net中的IOC和DI-初使用

    前面准备:下载spring.net并解压 下载地址:spring.net下载地址 Ioc:控制反转         DI:依赖注入 一.IOC(控制反转) 1.新建一个控制台程序springTest, ...

  5. spring 学习 AOP和IOC

    自11开始接触三大框架,至今已俞5载, 当时风光无限的ssh,现在还在被广泛使用,并有扩大之势的只有spring了 spring主要特性,是广为使用的AOP(面向切面)和IOC(控制反转) 1.其中, ...

  6. spring学习(01)之IOC

    spring学习(01)之IOC IOC:控制反转——Spring通过一种称作控制反转(IOC)的技术促进了低耦合.当应用了IOC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创 ...

  7. spring源码分析---IOC(1)

    我们都知道spring有2个最重要的概念,IOC(控制反转)和AOP(依赖注入).今天我就分享一下spring源码的IOC. IOC的定义:直观的来说,就是由spring来负责控制对象的生命周期和对象 ...

  8. Spring框架学习之IOC(二)

    Spring框架学习之IOC(二) 接着上一篇的内容,下面开始IOC基于注解装配相关的内容 在 classpath 中扫描组件 <context:component-scan> 特定组件包 ...

  9. Spring框架学习之IOC(一)

    Spring框架学习之IOC(一) 先前粗浅地学过Spring框架,但当时忙于考试及后期实习未将其记录,于是趁着最近还有几天的空闲时间,将其稍微整理一下,以备后期查看. Spring相关知识 spri ...

随机推荐

  1. 【前端】在Gulp中使用Babel

    Install $ npm install --save-dev gulp-babel babel-preset-es2015 用法1: const gulp = require('gulp'); c ...

  2. windows页面打印div(弹出新页面)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  3. redis 常用配置

    参数说明 redis.conf 配置项说明如下: 1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 2. 当Redis以守护进程方式 ...

  4. 【Android 疑难杂症1】android.content.ActivityNotFoundException: Unable to find explicit activity class

    android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.cnote ...

  5. Sprint(第九天11.22)

  6. selenium之js

    通过调用js代码来网页的滚动条: 出现以上错误的原因是 driver.set_window_size(600,600) 放置的位置不对

  7. 服务器CGI运行机制

    CGI概括: 定义 通用网关接口(Common Gateway Interface)是HTTP服务器与你的或其它机器上的程序进行"交谈"的一种工具,其程序须运行在网络服务器上. 功 ...

  8. Hibernate学习笔记(一)

    2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...

  9. 开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别

    以下是上述协议的简单介绍:BSD开源协议BSD开源协议是一个给于使用者很大自由的协议.基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布. 但”为 ...

  10. android:layout_weight的真实含义(转)

    首先声明只有在Linearlayout中,该属性才有效.之所以Android:layout_weight会引起争议,是因为在设置该属性的同时,设置android:layout_width为wrap_c ...