转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?opt=1 最近在接触到框架的底层的时候,遇到了反射,便想好好的学习和总结一下反射,帮助理解java框架的 运行流程和运行原理: 根据万物皆对象,所以类也是对象,通过反射得到描述类的对象,也就是这个类。有三种方法得到: 类名.; 实例.get; Class.forName(全类名); 得到描述类的类后,就可以通过类里面的方法,字段和注解。 在java编程中,使用的框架大多对底层进行了封装,在进行编程的过程中,如何调用底层封装好的类,属性或 方法,基本都是通过反射或代理的方式进行获取,其底层的原理都是通过反射进行操作的。 如果有这么一个类: package com.test; public class Test { public void sayHi(String name) { System.out.println("Hi "+name); } } 可以编写另外一个类来反射调用Test类的方法: package com.test; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Class { public static void main(String[] args) { String [] names ={"tom","tim","allen","alice"}; java.lang.Classclazz = Test.class; try { Method method = clazz.getMethod("sayHi", String.class); for(String name:names) method.invoke(clazz.newInstance(),name); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } } } 的反射是指,可以通过一个类名来探察这个类里面的信息,比如说类的属性名,属性名的修饰符,方法名, 方法返回值,方法修饰符等等,反正除了方法体得不到,其他都可以用反射得到;反射还可以生成类的实例, 通过这个实例定义属性,调用方法,特别是能调用私有的属性和私有的方法 import .lang.reflect.*; public class ReflectionTest { public static void main(String[] args) { try { Class c=Class.forName(".util.HashSet"); Object o=c.newInstance(); [] s=c.getDeclareds(); for(Method method:methods){ System.out.println(method); } Method m1=c.getMethod("add", Object.class); m1.invoke(o, "cyq"); m1.invoke(o, "hello"); m1.invoke(o, "java"); System.out.println(o); } catch (Exception e) { e.printStackTrace(); } } } 这是一个简单的反射例子,就是得到HashSet中的所有申明的方法,生成一个HashSet的实例,然后往里面添加对象