反射就是指程序在运行的时候能够知道一个类的自身信息。编程
自身信息有哪些:类方法、属性、成员变量、构造方法、包等框架
静态编译:在编译的时候进肯定类型,若是绑定对象成功,new 是静态加载类,就编译经过。函数
ClassA classA = new ClassA();
动态编译:在运行的时候肯定类型,绑定对象。最大发挥了Java的多态,下降类之间的耦合性。spa
Class c = Class.forName("ClassA");
ClassA classA = (ClassA) c.newInstance();
public Method getDeclaredMethod(String name, Class<?>... parameterTypes) // 获得该类全部的方法,不包括父类的 public Method getMethod(String name, Class<?>... parameterTypes) // 获得该类全部的public方法,包括父类的 //具体使用 Method[] methods = class1.getDeclaredMethods();//获取class对象的全部声明方法 Method[] allMethods = class1.getMethods();//获取class对象的全部public方法 包括父类的方法 Method method = class1.getMethod("info", String.class);//返回次Class对象对应类的、带指定形参列表的public方法 Method declaredMethod = class1.getDeclaredMethod("info", String.class);//返回次Class对象对应类的、带指定形参列表的方法 public Field getDeclaredField(String name) // 得到该类自身声明的全部变量,不包括其父类的变量 public Field getField(String name) // 得到该类自全部的public成员变量,包括其父类变量 //具体实现 Field[] allFields = class1.getDeclaredFields();//获取class对象的全部属性 Field[] publicFields = class1.getFields();//获取class对象的public属性 Field ageField = class1.getDeclaredField("age");//获取class指定属性 Field desField = class1.getField("des");//获取class指定的public属性 public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) // 得到该类全部的构造器,不包括其父类的构造器 public Constructor<T> getConstructor(Class<?>... parameterTypes) // 得到该类因此public构造器,包括父类 //具体 Constructor<?>[] allConstructors = class1.getDeclaredConstructors();//获取class对象的全部声明构造函数 Constructor<?>[] publicConstructors = class1.getConstructors();//获取class对象public构造函数 Constructor<?> constructor = class1.getDeclaredConstructor(String.class);//获取指定声明构造函数 Constructor publicConstructor = class1.getConstructor(String.class);//获取指定声明的public构造函数
理解了反射以后,AOP(面向切面编程)就很简单代理
反射用的地方不少,如今全部的框架里面几乎处处是反射code
1. 静态代理,直接写一个新类对实现类进行包装;对象
2. 动态代理,经过反射取得类实现,并调用方法,实现类必须实现其接口;blog
3. CGLib代理,不须要实现接口,能够对任意类进行实现;接口
参考:get