1.代理模式
[b]a. 代理好处:[/b]
1) 可以在委托类方法执行前后,加上特定的业务处理。
2) 可以节省资源,即在真正调用委托类的方法时,才会将委托类的实例给new出来,这样就节省了资源。
[b] b. 动态代理和静态代理的区别:[/b]
1) 静态代理的代理类只能为一个[b]特定的接口[/b]服务,即,只有实现了特定接口的类,才能被代理,如果出现不同接口,相同的代理处理的情况,必须写许多的代理类。
2) 动态代理则可以为[b]不同的接口[/b]服务,能够为不同的接口实现类,处理相同的代理情况,如在被代理类的方法执行前后加上日志记录,即需要所有的接口的方法执行前后都要加上日志记录,如果用静态代理,则需要为每个接口都编写一个代理类,这些代理类除了委托类(被代理类)的方法不一样,其他的都一样,这样就不好了,动态代理则解决了这个问题,只要编写一个动态代理类(实现InvocationHandler接口),在new动态代理类的过程中传入不同的接口,和接口实现类,动态代理类就会为该接口实现一个代理,被代理的类在执行其接口方法时,动态代理类就会自动加上日志记录。
3) 其中invoke方法中就是执行委托类的方法和在执行前后加上自己的业务,如,日志记录,在执行前后加上日志记录。
4) Proxy.newProxyInstance(c.getClass().getClassLoader(), c.getClass().getInterfaces(), invokeImpl)参数详解
第一个参数:被代理类的classLoader,类加载器。只要为被代理类的classLoader即可。
第二个参数:被代理类的接口,代理只有实现了相同的接口时才能产生代理,故参数中需要一个接口,决定其代理对象强转的类型。
第三个参数:代理类执行被代理接口方法执行前后的业务逻辑,如日志记录。该类要实现了InvocationHandler接口。
[b]c. 实现InvocationHandler接口所需要注意的地方:[/b]
1) 需要一个private类型的被代理类的类型对象。
2) 需要一个带Object类型参数的构造函数,方便被代理类对象的传入。
3) 复写invoke函数时,第一个参数要为1)所提到的类型的对象,表示执行某个对象的方法,invoke方法中的第一个参数,暂时未发现有何用处。
[b]d. new class[]{}详解:[/b]
实例化一个class类型的数组,大括号内部存放class类型的数据。如:new class[]{A.class}表示实例化一个长度为一的class类型的数组。
[b]a. 代理好处:[/b]
1) 可以在委托类方法执行前后,加上特定的业务处理。
2) 可以节省资源,即在真正调用委托类的方法时,才会将委托类的实例给new出来,这样就节省了资源。
[b] b. 动态代理和静态代理的区别:[/b]
1) 静态代理的代理类只能为一个[b]特定的接口[/b]服务,即,只有实现了特定接口的类,才能被代理,如果出现不同接口,相同的代理处理的情况,必须写许多的代理类。
2) 动态代理则可以为[b]不同的接口[/b]服务,能够为不同的接口实现类,处理相同的代理情况,如在被代理类的方法执行前后加上日志记录,即需要所有的接口的方法执行前后都要加上日志记录,如果用静态代理,则需要为每个接口都编写一个代理类,这些代理类除了委托类(被代理类)的方法不一样,其他的都一样,这样就不好了,动态代理则解决了这个问题,只要编写一个动态代理类(实现InvocationHandler接口),在new动态代理类的过程中传入不同的接口,和接口实现类,动态代理类就会为该接口实现一个代理,被代理的类在执行其接口方法时,动态代理类就会自动加上日志记录。
3) 其中invoke方法中就是执行委托类的方法和在执行前后加上自己的业务,如,日志记录,在执行前后加上日志记录。
4) Proxy.newProxyInstance(c.getClass().getClassLoader(), c.getClass().getInterfaces(), invokeImpl)参数详解
第一个参数:被代理类的classLoader,类加载器。只要为被代理类的classLoader即可。
第二个参数:被代理类的接口,代理只有实现了相同的接口时才能产生代理,故参数中需要一个接口,决定其代理对象强转的类型。
第三个参数:代理类执行被代理接口方法执行前后的业务逻辑,如日志记录。该类要实现了InvocationHandler接口。
[b]c. 实现InvocationHandler接口所需要注意的地方:[/b]
1) 需要一个private类型的被代理类的类型对象。
2) 需要一个带Object类型参数的构造函数,方便被代理类对象的传入。
3) 复写invoke函数时,第一个参数要为1)所提到的类型的对象,表示执行某个对象的方法,invoke方法中的第一个参数,暂时未发现有何用处。
[b]d. new class[]{}详解:[/b]
实例化一个class类型的数组,大括号内部存放class类型的数据。如:new class[]{A.class}表示实例化一个长度为一的class类型的数组。