通过反射(类类型)创建类的实例,调用类的方法,设置类的属性
2018-04-04 10:47
791 查看
Bean工厂
package com.test; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * Bean工厂 */ public class BeanFactory { /** * 创建实例 * * @param clazz * @return */ public static Object newInstance(Class<?> clazz) { Object instance; try { instance = clazz.newInstance(); } catch (Exception e) { throw new RuntimeException(e); } return instance; } /** * 方法调用 * * @param obj * @param method * @param args * @return */ public static Object invokeMethod(Object obj, Method method, Object... args) { Object result; try { method.setAccessible(true); result = method.invoke(obj, args); } catch (Exception e) { throw new RuntimeException(e); } return result; } /** * 设置成员变量值 * * @param obj * @param field * @param value */ public static void setField(Object obj, Field field, Object value) { try { field.setAccessible(true); field.set(obj, value); } catch (Exception e) { throw new RuntimeException(e); } } }
method.setAccessible(true);
field.setAccessible(true);
使私有的成员和方法可以访问
测试
package com.test; public class Student { private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } }
package com.test; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test { public static void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException { Class cl = Class.forName("com.test.Student"); //获得Student类的类类型 //通过类类型创建Student类的实例 Student student= (Student) BeanFactory.newInstance(cl); //获得类中定义的属性 Field[] beanFields = cl.getDeclaredFields(); //遍历属性 for (Field beanField : beanFields) { //设置属性,依赖注入的影子 BeanFactory.setField(student, beanField, Integer(1)); } System.out.println(student.getId()); // // BeanFactory.setField(student, "name", "king"); } private static Object Integer(int i) { // TODO Auto-generated method stub return i; } }
相关文章推荐
- 如何通过C#.NET中的反射机制来创建C#.NET泛型类的实例,并调用其方法??
- 如何通过C#.NET中的反射机制来创建C#.NET泛型类的实例,并调用其方法??
- 创建Bean的三种方式 在大多数情况下,Spring容器直接通过new关键字调用构造器来创建Bean实例,而class属性指定Bean实例的实现类,但这不是实例化Bean的唯一方法。实际上,Sprin
- C#反射新建类实例和调用类方法及属性帮助类 以及获取或设置对象属性中字段值帮助类
- 通过反射创建私有化类的对象,调用类的私有方法,改变私有属性
- [No000085]C#反射Demo,通过类名(String)创建类实例,通过方法名(String)调用方法
- 利用反射来动态创建实例和调用方法(上)
- [c#美味] 使用反射动态创建实例并调用方法
- 编写一个文件,读取 src 下面day12包 下面的my.properties 文件,文件内容如下, className=day12.User 结合 IO、反射知识,完成 配置文件中对象的创建和方法调用。并编写方法,列举出 Student 类中所有的属性、
- 利用反射来动态创建实例和调用方法
- C#反射实例——获取及设置对象属性,运行对象方法
- 对对象类型和调用方法属性进行存储以提升反射性能
- 泛型约束where条件的使用(通过类型参数动态反射创建实例)
- java基础之反射-通过反射调用某个属性的setter和getter方法
- 泛型约束where条件的使用(可以通过类型参数动态反射创建实例)
- 通过反射获取类属性字段 以及 调用类方法
- 使用反射调用类型成员 方法,字段,属性
- 利用反射对私有属性/方法进行设置/调用(转自己贴)
- 利用反射来动态创建实例和调用方法
- 利用反射来动态创建实例和调用方法