反射就是在运行状态把 Java 类中的各种成分映射成相应相应的 Java 类,可以动态得获取所有的属性以及动态调用任意一个方法。 (1). 一段java代码在程序的运行期间会经历三个阶段:source–>class–>runtime (2). Class对象 在java中用一个Class对象来表示一个java类的class阶段 Class对象封装了一个java类定义的成员变量、成员方法、构造方法、包名、类名等。
(1). 获得java类的各个组成部分,首先需要获得代表java类的Class对象 获得Class对象有以下三种方式:
Class.forname(className) 用于做类加载 obj.getClass() 用于获得对象的类型 类名.class 用于获得指定的类型,传参用(2). 反射类的构造方法,获得实例
Class clazz = 类名.class; Constuctor con = clazz.getConstructor(new Class[]{paramClazz1,paramClazz2,.....}); con.newInstance(params....);(3).反射类的成员方法
Method m = clazz.getMethod(methodName,new Class[]{paramClazz1,paramClazz2,.....}); m.invoke();(4).反射类的属性
Field field = clazz.getField(fieldName); field.setAccessible(true);//设置为可访问 filed.setObject(value); //设置值 Object value = field.get(clazz); //获得值 Object staticValue = filed.get(Class); //获得静态值通过反射的方式操作JavaBean的属性,jdk提供了PropertyDescription类来操作访问JavaBean的属性,Beantils工具基于此来实现。
(1).操作一个属性
Object obj = new Object(); PropertyDescriptor pd = new PropertyDescriptor(propertyName,Class); //声明属性描述对象,一次只可描述一个属性 Method m = pd.getWriterMethod();//获取setter方法 m.invoke(obj,value); Method m = pd.getReaderMethod();//获取getter方法 Object value = m.invoke(obj);(2).操作多个属性
BeanInfo bi = Instospector.getBeanInfo(beanClass);//获取Bean描述对象 PropertyDescriptor[] pds = bi.getPropertyDescriptors();//获取属性描述对象数组 拿到属性描述对象数组之后再循环数组,剩余的操作就跟"操作一个属性"相同了。转载原文:java 中反射机制和内省机制的区别