反射:
- 工厂模式,反射,作用
工厂模式:代替new,利用静态函数的形式,根据参数返回新建的子实例,抽象工厂模式,就是核心类只提供抽象的工厂接口。抽象工厂中有具体工厂,具体工厂中有抽象产品,抽象产品中有具体产品。隔离了具体类的产生。
反射:在运行状态下,可以动态加载一个只有名称的类,在堆内存中,有一个class类型的对象,这个对象包含了完成的结构信息,通过它,可以看到类的结构,如同镜子。Class对象是在需要的时候才会加载,但static初始化是在类加载时进行的。反射受class类与reflect的支持。
作用:动态的获取类的信息,检测和修改它本身的。 - Class类,java.lang.reflect.*
我们无法自主创建Class类对象,它是在类被调用时由Java虚拟机自动创建的。Class.forname()方法返回一个对应类的class对象。
java.lang.reflect.*包提供了获取类和对象的反射信息的类与接口,他和class类都是通过jvm创建加载的。
二:代理
- 动态代理与静态代理
将具体的实现同调用方进行解偶,通过面向接口进行编码,将所有的具体实现隐藏在内部。
创建接口—创建具体类实现接口,创建代理类实现接口。具体类需要实现逻辑,代理类调用具体类的具体方法。
静态代理:在编译期间就把所有的接口,类,代理类全部完成。
动态代理:在需要的时候进行代理类的创建。利用反射来实现动态代理,即不需要知道什么时候创建,代理哪个。
通过实现InvocationHandler接口,里有个invoke(代理实例,调用方法,方法的参数列表)方法,在代理类的构造器中传递具体类的对象如:
Privte Object object;//接受具体类
Public dy(Object obj){this.object=obj}//带参数的构造器传递具体实现类的对象。
InvocationHandler进行方法块的调用,而动态代理实例和类是有Proxy完成的。
Proxy的静态方法getProxyClass(xx.class.getClassLoader()(类加载器),接口列表数组)生成代理类ProxyClass,在通过反射,调用代理类的构造器来生成代理实例:XX xx=(XX)procyClass.getConstructor(InvocationHandler.class).newInstance(重写的invocationHandler)
利用Cglib也可以通过面向继承的方式进行动态代理。 - AOP
面向切面编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的前提下动态着给程序统一添加功能的一种技术。主要使用它做日志记录,性能统计,安全控制,事物管理,在动态管理代码模块中添加
一些有用的代码(日志,性能统计等)。