代理的概念:用一个角色来代替另一个角色完成某些特定的功能。(引用某大神对代理的理解的原话,个人感觉很贴切)。
代理需要有三种角色:1、接口角色,2、代理对象角色(概念中的一个角色),3、被代理对象。(注意,代理对象和被代理对象必须实现相同的接口。个人理解,不懂对不对,请高手指正)
静态代理比较好理解,说白了就是两个实现类A和B实现同一个接口,我们可以定义类A为代理类,而类B为被代理类。A类在实现接口的同时还新增了一些处理方法,而这些方法就是在对目标对象方法进行调用之前进行的处理。
接口:
package spring.proxy;
public interface UserManager
{public String getUser(int userID);
public void delUser(int userID); public void modifyUser(String userID,String password);}
实现类B
package spring.proxy;
public class UserManagerImpl implements UserManager
{@Override
public void delUser(int userID) { System.out.println("delUser------"); }@Override
public String getUser(int userID) { System.out.println("getUser------"); return ""+userID; }@Override
public void modifyUser(String userID, String password) { System.out.println("modifyUser------"); }}
实现类A(代理类)
package spring.proxy;
public class UserManagerImplProxy implements UserManager
{private UserManager userManager;
public UserManagerImplProxy(UserManager userManager) { this.userManager = userManager; } @Override public void delUser(int userID) { checkMethod(); userManager.delUser(userID);}
@Override
public String getUser(int userID) { checkMethod(); String user = userManager.getUser(userID); return user; }@Override
public void modifyUser(String userID, String password) { checkMethod(); userManager.modifyUser(userID, password); } //新增处理方法public void checkMethod()
{ System.out.println("checkMethod-------"); }}
客户端测试类
package spring.proxy;
public class Client
{public static void main(String[] args)
{ UserManagerImplProxy proxy = new UserManagerImplProxy(new UserManagerImpl()); proxy.delUser(1); }}
测试结果:
checkMethod-------
delUser------
动态代理:
动态代理需要实现jdk的一个接口:java.lang.reflect.InvocationHandler
新建一个类实现该接口,
package spring.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class DynamicProxy implements InvocationHandler
{ private Object targetObject;//根据目标对象创建代理
public Object createProxyInstance(Object targetObject) { this.targetObject = targetObject; return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); }@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { checkMethod(); Object obj = method.invoke(targetObject, args); return obj; } //新增处理功能 public void checkMethod() { System.out.println("checkMethod-------"); }}
测试类:
package spring.proxy;
public class Client
{public static void main(String[] args)
{ DynamicProxy dynamicProxy = new DynamicProxy(); UserManager userManager = (UserManager) dynamicProxy.createProxyInstance(new UserManagerImpl());//该类UserManagerImpl是静态代理的实现类A,该类实现接口UserManager userManager.getUser(1); }}
测试结果:
checkMethod-------
getUser------