Java代理模式
Java代理模式
- 静态代理
- 动态代理
- Cglib
代理模式:
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
静态代理:
public interface UserInterface {
public void say();
}
public class User implements UserInterface{
public void say() {
System.out.println("hello");
}
}
public class UserStaticProxy implements UserInterface{
private User user = new User();
public UserStaticProxy(User user){
this.user = user;
}
@Override
public void say() {
System.out.println("静态代理前");
user.say();
System.out.println("静态代理后");
}
}
Output:
动态代理:
public class UserDynamicFactory {
private Object object;
public UserDynamicFactory(Object obj){
this.object = obj;
}
public Object getIntance(){
return Proxy.newProxyInstance(
object.getClass().getClassLoader(),
object.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("动态代理前");
Object o = method.invoke(object);
System.out.println("动态代理后");
return o;
}
});
}
}
Output:
Cglib:
public class Staff {
public void say(){
System.out.println("Woo!!!!");
}
}
public class StaffCglib implements MethodInterceptor {
private Object object;
public StaffCglib(Object object){
this.object = object;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("Cglib前");
Object obj = method.invoke(object);
System.out.println("Cglib后");
return obj;
}
public Object getInstance(){
Enhancer en = new Enhancer();
en.setSuperclass(object.getClass());
en.setCallback(this);
return en.create();
}
}
OutPut:
测试代码:
public class ProxyTest {
public static void main(String[] args){
User user = new User();
new UserStaticProxy(user).say();
UserInterface userDynamic = (UserInterface) new UserDynamicFactory(user).getIntance();
userDynamic.say();
Staff staffCglib = (Staff)new StaffCglib(new Staff()).getInstance();
staffCglib.say();
}
}
注意事项:
测试如果是自己引入jar包,需要引入cglib和asm包(cglib3.1及以上版本和asm2.2以上版本有冲突)
浮生若梦,且待我静静,该如何让这场梦不会想重来一遍