動態代理限制快取容器的容量

壹頁書發表於2013-11-07
在Java Web中經常使用快取,但是如果快取資料量非常大,則容易出現OOM的情況。
可以使用動態代理,限制快取容器的容量。
如果達到容量上限,則可以移除過期的快取資料。

  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Proxy;
  4. import java.util.HashMap;
  5. import java.util.Map;

  6. public class MapInvocationHandler implements InvocationHandler {

  7.     private Map<String, String> map = new HashMap<String, String>();

  8.     private int limit = 10;

  9.     public MapInvocationHandler(int limit) {
  10.         this.limit = limit;
  11.     }

  12.     public MapInvocationHandler() {
  13.     }

  14.     public Map<String, String> getInstance() {
  15.         return (Map<String, String>) Proxy.newProxyInstance(map.getClass()
  16.                 .getClassLoader(), map.getClass().getInterfaces(), this);
  17.     }

  18.     @Override
  19.     public Object invoke(Object proxy, Method method, Object[] args)
  20.             throws Throwable {
  21.         Object result;
  22.         if ("put".equals(method.getName())) {
  23.             if (map.size() == limit) {
  24.                 return "已達容器上線";
  25.             }
  26.             System.out.println("Key:" + args[0] + ",Value:" + args[1]);
  27.         }
  28.         result = method.invoke(map, args);
  29.         return result;
  30.     }

  31.     public static void main(String[] args) {
  32.         Map<String, String> map = new MapInvocationHandler(3).getInstance();
  33.         map.put("1", "1");
  34.         map.put("2", "2");
  35.         map.put("3", "3");
  36.         String s = map.put("4", "4");
  37.         System.out.println(s);
  38.     }

  39. }

其中invoke方法中的proxy引數是代理物件。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-776054/,如需轉載,請註明出處,否則將追究法律責任。

相關文章