Java反射机制模拟Spring IOC容器

Ref:

Java反射机制深入研究  【综合了几个帖子】

深入研究java.lang.Class类 【写的挺好】

理解java.lang.Class类


java反射机制


package reflection;

import java.lang.reflect.Method;

public class InvokeTest {
	public String add(int param1, int param2) {
		return param1 + " + " + param2 + " = " + (param1 + param2);
	}

	public String sayHi(String message) {
		return "hi " + message;
	}

	public String objectToString(Method method) {
		return method.toString();
	}

	public static void main(String[] args) throws Exception {
		// 常规执行方式
		InvokeTest invokeTest1 = new InvokeTest();
		System.out.println(invokeTest1.add(1, 2));
		System.out.println(invokeTest1.sayHi("jack"));

		// 第一步:获取Class对象,方式:1、使用Class类的静态方法;2、使用类的.class语法;3、使用对象的getClass()方法
		Class<?> clazz;
		clazz = InvokeTest.class;
		clazz = Class.forName("reflection.InvokeTest");
		InvokeTest invokeTest = new InvokeTest();
		clazz = invokeTest.getClass();
		// 第二步:生成新的对象
		Object invokeTest2 = clazz.newInstance();
		System.out.println(invokeTest2 instanceof InvokeTest);

		// 第三步:通过反射调用方法,首先获得与该方法对应的Method对象
		// 第一个参数是要调用的方法名,第二个参数是该方法所需要的参数的Class对象数组
		Method addMethod = invokeTest2.getClass().getMethod("add", new Class[] { int.class, int.class });
		Method sayHiMethod = invokeTest2.getClass().getMethod("sayHi", new Class[] { String.class });
		Method objectToStringMethod = invokeTest2.getClass().getMethod("objectToString", new Class[] { Method.class });
		// 单一参数的也可以这样,多参数的需要用 new Class[] {}
		sayHiMethod = invokeTest2.getClass().getMethod("sayHi", String.class);
		objectToStringMethod = invokeTest2.getClass().getMethod("objectToString", Method.class);

		// 第四步:调用方法
		String addResult = (String) addMethod.invoke(invokeTest2, new Object[] { 3, 2 });
		System.out.println(addResult);
		String sayHiResult = (String) sayHiMethod.invoke(invokeTest2, "rose");
		System.out.println(sayHiResult);
		String objectToStringResult = (String) objectToStringMethod.invoke(invokeTest2, objectToStringMethod);
		System.out.println(objectToStringResult);
	}
}

运行结果:

1 + 2 = 3
hi jack
true
3 + 2 = 5
hi rose
public java.lang.String reflection.InvokeTest.objectToString(java.lang.reflect.Method)



模拟Spring IOC容器



package com.xxr.spring;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

public class ClassPathXmlApplicationContext implements BeanFactory {
	private Map<String, Object> beans = new HashMap<String, Object>();

	public ClassPathXmlApplicationContext() throws Exception {
		SAXBuilder sBuilder = new SAXBuilder();
		Document document = sBuilder.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml"));
		Element root = document.getRootElement();
		List elementList = root.getChildren("bean");
		for (int i = 0; i < elementList.size(); i++) {
			Element element = (Element) elementList.get(i);
			String id = element.getAttributeValue("id");
			String clazz = element.getAttributeValue("class");
			System.out.println(id + ":" + clazz);
			Object o = Class.forName(clazz).newInstance();
			beans.put(id, o);
			for (Element propertyElement : element.getChildren()) {
				String name = propertyElement.getAttributeValue("name");
				String bean = propertyElement.getAttributeValue("bean");
				Object beanObject = beans.get(bean);
				String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
				System.out.println("method name = " + methodName);
				Method method = null;
				// 两种方式都可以
				method = o.getClass().getMethod(methodName, new Class[]{beanObject.getClass().getInterfaces()[0]});
				method = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);
				// 两种方式都可以
				method.invoke(o, new Object[]{beanObject});
				method.invoke(o, beanObject);
			}
		}
	}

	@Override
	public Object getBean(String name) {
		return beans.get(name);
	}

}

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="u" class="com.xxr.dao.impl.UserDAOImpl" />
	<bean id="userService" class="com.xxr.service.UserService">
		<property name="userDAO" bean="u" />
	</bean>
</beans>


package com.xxr.spring;

public interface BeanFactory {
	public Object getBean(String name);

}


package com.xxr.service;

import org.junit.Test;

import com.xxr.model.User;
import com.xxr.spring.BeanFactory;
import com.xxr.spring.ClassPathXmlApplicationContext;

public class UserServiceTest {

	@Test
	public void testAdd() throws Exception {
		BeanFactory beanFactory = new ClassPathXmlApplicationContext();
		UserService userService = (UserService) beanFactory.getBean("userService");
		User user = new User();
		userService.add(user);
	}

}



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值