使用一个代理对象将对象包装起来,然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理,代理对象决定是否以及何时将方法调用转到原始对象上。

静态代理

代理类和被代理类在编译期间,就确定下来了

  1. interface clothFactory{
  2. void productCloth();
  3. }
  4. //代理类
  5. class proxyClothFac implements clothFactory{
  6. private clothFactory clothFactory;
  7. public proxyClothFac(clothFactory clothFactory) {
  8. this.clothFactory=clothFactory;
  9. }
  10. @Override
  11. public void productCloth() {
  12. System.out.println("代理工厂 start..");
  13. clothFactory.productCloth();
  14. System.out.println("代理工厂 end..");
  15. }
  16. }
  17. //被代理类
  18. class nikeFactory implements clothFactory{
  19. @Override
  20. public void productCloth() {
  21. System.out.println("nike生产衣物");
  22. }
  23. }
  24. public class staticProxy {
  25. public static void main(String[] args) {
  26. //被代理类对象
  27. nikeFactory nikeFactory = new nikeFactory();
  28. //创建代理类对象
  29. proxyClothFac proxyClothFac = new proxyClothFac(nikeFactory);
  30. proxyClothFac.productCloth();
  31. }
  32. }

动态代理

代理类一开始不知道自己真实代理的对象,当首次使用代理类时传入需要代理的对象(实现动态代理)

  1. interface human{
  2. void eat(String food);
  3. }
  4. //被代理类
  5. class superMan implements human{
  6. @Override
  7. public void eat(String food) {
  8. System.out.println(food+"好吃");
  9. }
  10. }
  11. //代理类
  12. class proxyFactory{
  13. //调用方法 返回一个代理类对象
  14. public static Object getProxyInstance(Object obj){
  15. myInvokeHandler handler = new myInvokeHandler();
  16. handler.bind(obj);
  17. return Proxy.newProxyInstance(
  18. obj.getClass().getClassLoader(),
  19. obj.getClass().getInterfaces(),
  20. handler);
  21. }
  22. }
  23. //实际调用方法的地方
  24. class myInvokeHandler implements InvocationHandler{
  25. private Object obj;
  26. public void bind(Object obj){
  27. this.obj=obj;
  28. }
  29. @Override
  30. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  31. //代理类对象调用的方法
  32. System.out.println("代理类对象方法调用");
  33. return method.invoke(obj, args);
  34. }
  35. }
  36. public class dynamicProxy {
  37. public static void main(String[] args) {
  38. superMan superMan = new superMan();
  39. //当通过创建代理类对象时 实现的是它们共同的接口(类似于匿名内部类)
  40. //传入真实需要代理的对象
  41. human proxyInstance = (human) proxyFactory.getProxyInstance(superMan);
  42. proxyInstance.eat("牛肉干");
  43. //动态调用前面静态代理中的方法
  44. clothFactory proxyInstance1 = (clothFactory) proxyFactory.getProxyInstance(new nikeFactory());
  45. proxyInstance1.productCloth();
  46. }
  47. }