java的反射原理与Spring的自动注入(转载)
2015-08-09 21:55
399 查看
Java反射原理与Spring的自动注入
对于任意一个类都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性。
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
驱动类:
此时,username被设置为hehe。
参考资料:
java 反射,spring 自动注入原理
反射的定义
java的反射机制就是在运行状态中,对于任意一个类都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性。
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Sping的自动注入原理
一个Bean的类:[code]public class User{ private String username; private String mobile; public String getUsername(){ return username; } public void setUsername(String username){ this.username = username; } public String getMobile(){ return mobile; } public void setMobile(String mobile){ this.mobile = mobile; } }
驱动类:
[code]import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; public class ReflectionTest { @SuppressWarnings({ "unchecked", "rawtypes" }) public static void main(String[] args) throws Exception { //id 为自己指定的值 String id = "user"; Map<String, Object> context = new HashMap<String, Object>(); //这里是通过User.class.getName()获取类名,通用的作法是通过配置文件获取类名 //三种方法,可以获得类名 //1. User.class.getName() //2. new User().getName() //3. Class.forName("User").getName() Class c = Class.forName(User.class.getName()); Object object = c.newInstance(); // 模拟spring容器 context.put(id, object); Method method = c.getDeclaredMethod("setUsername", String.class); // setter注入 method.invoke(object, "xiaoqiang"); System.out.println(((User) object).getUsername()); } }
对反射定义的理解代码
在运行状态中,对任意一个类,都能够知道这个类的所有方法和属性
代码示例如下:[code]import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectionTest { @SuppressWarnings("rawtypes") public static void main(String[] args) throws Exception { Class c = Class.forName(User.class.getName()); System.out.println("------------------------------------"); //获取所有User类下面定义的所有的方法 Method method[] = c.getDeclaredMethods(); for(int i=0;i<method.length;i++){ System.out.println(method[i].getName()); } System.out.println("------------------------------------"); //获取所有User类下面定义的所有的属性 Field f[]=c.getDeclaredFields(); for(int i=0;i<f.length;i++){ System.out.println(f[i].getName()); } System.out.println("------------------------------------"); //获取所有User类下面定义的所有的方法以及父类的方法 Method method1[] = c.getMethods(); for(int i=0;i<method1.length;i++){ System.out.println(method1[i].getName()); } System.out.println("------------------------------------"); //获取所有User类下面定义的所有的属性以及父类的属性 Field f1[]=c.getDeclaredFields(); for(int i=0;i<f1.length;i++){ System.out.println(f1[i].getName()); } } }
对于任意一个对象,都可以调用它的任一属性和方法
代码实例如下:[code]import java.lang.reflect.Field; public class ReflectTest{ public static void main(String[] args) throws Exception { Class c = Class.forName(User.class.getName()); Object obj = c.newInstance(); Field field = c.getDeclaredField("username"); field.setAccessible(true); field.set(object,"hehe"); System.out.println((User)object.getUsername()); } }
此时,username被设置为hehe。
参考资料:
java 反射,spring 自动注入原理
相关文章推荐
- Java的垃圾回收机制笔记
- Java图形化界面
- java abstract与interface解析
- SSH整合环境下Spring配置文件的配置
- java异常处理机制
- java里的static和final
- 智渔课堂官方免费教程五:Java基础之运算符
- I学霸官方免费教程五:Java基础之运算符
- 10005---SpringMVC REST
- java.lang.NullPointerException: No FileItemFactory has been set 解决方案
- Java学习笔记-----------套接字编程-----多线程 及控制最大连接数
- java获取的一些路径
- jdk1.5新特性之泛型(三)
- 代理服务器的理解(1):Windows环境下的代理服务器设置
- java多线程
- java垃圾回收
- java中String的常用方法
- SPRING依赖注入
- Java学习--(七)类
- LIS 最长递增子序列 Java实现