【JAVA】反射总结
反射是什么?
反射就是指程序在运行的时候可以知道一个类的自身信息。
自身信息有哪些:类方法、属性、成员变量、构造方法、包等
动态编译和静态编译
静态编译:在编译的时候进确定类型,如果绑定对象成功,new 是静态加载类,就编译通过。
ClassA classA = new ClassA();
动态编译:在运行的时候确定类型,绑定对象。最大发挥了Java的多态,降低类之间的耦合性。
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(面向切面编程)就很简单
反射用的地方很多,现在所有的框架里面几乎到处是反射
动态代理分几种方式:
1. 静态代理,直接写一个新类对实现类进行包装;
2. 动态代理,通过反射取得类实现,并调用方法,实现类必须实现其接口;
3. CGLib代理,不需要实现接口,可以对任意类进行实现;
参考:
路慢慢其休远羲,吾将上下而求所