在java中查找对方法调用的引用,以使用反射清理未使用的pojo字段

时间:2015-01-06 20:19:22

标签: java reflection

我有一个非常胖的pojo java类,有超过1000个字段/ getter& setter方法。其中一些领域已不再使用,我想清理那个类。我不太了解反射,但我希望能够以编程方式识别不再在另一个类中引用的字段。

识别是否需要清理字段的方法是查看字段的setter方法是否在另一个字段中被调用,如果不是,它是清理的候选者。

我已经找到了如何使用反射来提取方法和字段名称,但我不知道从哪里开始识别那些在另一个类的执行中没有引用setter的字段。

public class GetterSetterReflec {

    public static void main(String args[]){
        printGettersSetters(SearchEngineClientModel.class);
    }

    public static void printGettersSetters(Class<?> aClass)
    {
          Method[] methods = aClass.getMethods();

          Field[] fields = aClass.getDeclaredFields();
          for(Field field : fields){
              System.out.println(field);
          }

          for(Method method : methods){
            if(isGetter(method)) System.out.println("getter: " + method);
            if(isSetter(method)) System.out.println("setter: " + method);
          }
    }

        public static boolean isGetter(Method method){
          if(!method.getName().startsWith("get"))      return false;
          if(method.getParameterTypes().length != 0)   return false;  
          if(void.class.equals(method.getReturnType()))
                  return false;
          return true;
        }

        public static boolean isSetter(Method method){
          if(!method.getName().startsWith("set")) return false;
          if(method.getParameterTypes().length != 1) return false;
          return true;
        }
}

我很感激你能提供的任何帮助。提前谢谢!

1 个答案:

答案 0 :(得分:0)

我认为这不可能通过反思来实现。您可以使用IDE(或其他静态分析工具)来发现调用层次结构。这种方法99%的时间都有效,但在运行时通过反射(例如,通过框架)执行的任何调用都失败了。

如果要捕获运行时调用,可以使用AOP建议方法。一种更简单的方法可能是从您怀疑未使用的方法引入日志语句(或抛出异常),然后运行测试。如果您的测试覆盖率很差,您可以将日志语句引入可疑方法,然后允许您的应用程序在生产中运行一段时间(使用标记语句),直到您有足够的信心去除可疑方法。


动态方法调用示例

考虑以下Spring bean:

public class Foo implements ApplicationContextAware {

    @Override
    public void setApplicationContext(ApplicationContext ctx) 
             throws BeansException {
        // you won't find any reference to this setter; 
        // ...it is invoked at runtime by the Spring framework

    }

}