文章目录
反射机制
JAVA反射机制是在运行状态中,
对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意方法和属性;
这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
反射相关类
下面通过几个具体例子来了解反射的所有基本的常用相关方法!!
反射的作用(举例说明)
可通过反射机制,
通过一个类A实例化的对象a(或者类名);
访问a的实例域(成员变量),所有方法(函数),
以及 类A的所有构造方法,以及Static变量或方法。
1 获得CLASS类
Class cl; String ClassName = "java.lang.String"; String str = "abcdefg"; try { cl = Class.forName(ClassName); 第一种方法 通过类名 cl = str.getClass(); } 第二种方法 通过对象 catch (ClassNotFoundException e) { e.printStackTrace(); }
2 获得并打印类A的所有构造方法的细节
public static void printConstructors(Class cl){ Constructor[] constructors = cl.getDeclaredConstructors(); 获得类A的所有构造方法 for (Constructor constructor : constructors) 遍历构造方法 { String name = constructor.getName(); System.out.print("\n "); String modifiderString = Modifier.toString(constructor.getModifiers()); ModierString中保存构造方法中所有的访问修饰符 if(modifiderString.length()>0) { System.out.print(modifiderString+" "); 输出所有的访问修饰符 } System.out.print(name+"("); 输出构造方法名字 Class[] paratypes = constructor.getParameterTypes(); 输出参数类型 for (int j = 0; j < paratypes.length; j++) { if (j>0) { System.out.print(","); 多个参数用空格分隔 } System.out.print(paratypes[j].getName()); } System.out.print(")"); } }
3 获得并打印类A的所有方法的细节
public static void printMethods(Class cl){ Method[] methods = cl.getDeclaredMethods(); 获得类A的所有方法 for (Method method : methods) { 遍历方法 Class retype = method.getReturnType(); 方法返回值 String name = method.getName(); 方法名 String modifiers = Modifier.toString(method.getModifiers()); 访问修饰符 System.out.print("\n "); if (modifiers.length()>0) { System.out.print(modifiers+" "+retype.getName()+" "+name+"("); } Class[] parameters = method.getParameterTypes(); for (int i = 0; i < parameters.length; i++) { if (i>0) { System.out.print(","); } System.out.print(parameters[i].getName()); } System.out.print(")"); } }
4 获得并打印类A的所有实例域细节
public static void printfield(Class cl){ Field[] fields = cl.getDeclaredFields(); 获得所有实例域(成员变量) for (Field field : fields) { 遍历 System.out.print("\n "); Class type = field.getType(); 获取成员变量类型 String modiferString = Modifier.toString(field.getModifiers()); 访问修饰符 if (modiferString.length()>0){ System.out.print(modiferString+" "); } System.out.print(type.getName()+" "+field.getName()); 成员变量名 } }
5 访问任意对象的所有实例域及其值
Field[] fields = cl.getDeclaredFields(); 获取所有实例域 AccessibleObject.setAccessible(fields, true); 获取访问权限 for (Field f : fields) { 遍历实例域 System.out.print("\n"+f.getName()+" "); Object obj = f.get(a); 获取对象a的f实例域的值,在obj中保存 Class t = obj.getClass(); if (t.isPrimitive()) { 基本数据类型 System.out.print(obj); }else { 引用类型 System.out.print(obj.toString()); } }
5 访问任意对象的任意方法
Method m = cl.getDeclaredMethod("方法名",方法参数列表.class); m.setAccessible(true); 获取访问权限 m.invoke(a,方法参数); 调用对象a的m方法