如何在不重复所有函数的情况下为另一个类创建代理类

时间:2014-03-30 19:43:57

标签: java design-patterns proxy

我想为Class1创建一个代理类:

Public class Class1 {
  public void log(String str){
       ....
  }

  public void log(String str1, Object obj){
       ....
  }

  .... 
}

Class1有许多具有相同名称“log”但具有不同参数的日志函数。我想为Class1创建一个代理/代理类,但不想重复它的所有功能。我尝试了以下方法,它没有用。

public class agentForClass1 {
   protected Class1 obj1;

   public log(Object... objs){
      obj1.log(objs);
   }
}
你能帮忙吗?这在Java中是否可行?

1 个答案:

答案 0 :(得分:1)

是的,它是:)你可以使用java Reflection功能。

这是一张草图,我已经测试了你给出的Class1的定义。诀窍是isInstance方法。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Class1Agent {

    private Class1 class1 = new Class1();

    public void log(Object... objects) throws IllegalArgumentException,
            IllegalAccessException, InvocationTargetException {
        Method[] methods = class1.getClass().getMethods();
        for (Method method : methods) {
            Class<?>[] parameterTypes = method.getParameterTypes();
            if (objects.length == parameterTypes.length) {
                int i = 0;
                while (i < objects.length
                        && parameterTypes[i].isInstance(objects[i])) {
                    ++i;
                }
                if (i == objects.length) {
                    method.invoke(class1, objects);
                    break;
                }
            }
        }
    }
}