我有一个非常胖的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;
}
}
我很感激你能提供的任何帮助。提前谢谢!
答案 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
}
}