Ref:
Java反射机制深入研究 【综合了几个帖子】
深入研究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);
}
}