简单理解Java反射机制
JAVA反射机制:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能给调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的反射机制。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。
JAVA反射机制提供的功能:
1.在运行时判断任意一个对象所属的类
2.在运行时构造任意一个类的对象
3.在运行时判段任意一个类所具有的成员变量和方法
4.在运行时调用任一个对象的方法
5.在运行时创建新类对象
6.在使用Java的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象。
JAVA获取类Class对象的方式(Reflects为自定义的一个类):
//通过Class.forName的方式。好像JDBC常用到这个的! Class reflects_1 = Class.forName("Reflects"); //java中每个类都有自己的class属性 Class reflects_2 = Reflects.class; //java语言中任何一个java对象都有getClass 方法 Reflects reflects = new Reflects(); Class reflects_3 = reflects.getClass();
获取类的Fields:
可以通过反射机制得到某个类的某个属性,然后改变对应于这个类的某个实例的该属性值。JAVA 的Class<T>类提供了几个方法获取类的属性。
public Field getField(String name) | 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段 |
public Field[] getFields() | 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段 |
public Field getDeclaredField(String name) | 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段 |
public Field[] getDeclaredFields() |
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段 |
Class<?> c = Class.forName("java.lang.Integer"); //获取所有的属性? Field[] fs = c.getDeclaredFields(); //定义可变长的字符串,用来存储属性 StringBuffer sb = new StringBuffer(); //里边的每一个属性 for(Field field:fs){ sb.append("\t");//空格 sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等 sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字 sb.append(field.getName()+";\n");//属性的名字 } System.out.println(sb);
获取类的Methon:
通过反射机制得到某个类的某个方法,然后调用对应于这个类的某个实例的该方法,Class<T>类提供了几个方法获取类的方法。
public Method getMethod(String name, Class<?>... parameterTypes) |
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法 |
public Method[] getMethods() |
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法 |
public Method getDeclaredMethod(String name, Class<?>... parameterTypes) |
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法 |
public Method [] getDeclaredMethods() |
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法 |
Class<?> c = Class.forName("java.lang.Integer"); Method[] mts = c.getDeclaredMethods();
StringBuffer sb = new StringBuffer(); for(Method m : mts){ sb.append("\t"); sb.append(Modifier.toString(m.getModifiers())+ " " ); sb.append(m.getReturnType().getSimpleName()+" "); sb.append(m.getName()+"\n"); }
System.out.println(sb);