2015-11-23 3 views
-1

My Eclipse, есть ошибка, если имя_поля является mFieldnamegetter и setter должны быть getMFieldName и setMFieldname соответственно вместо этого getmFieldName и setmFieldName .I необходимо определить все такие случаи . Я пытался прочитать из каждого * .java-файла, чтобы идентифицировать такой случай. Но это было очень трудно, так как мой проект содержит много файлов и подкатегории пакетовКак найти имя переменной из списка класса в пакете

Если кто-нибудь знает решение пожалуйста помочь

+1

Опубликуйте свой код, вам будет легче ориентироваться. – Perdomoff

+2

Вы должны знать, что не многие используют префиксы для переменных экземпляра в Java. (Это не пытается ответить на вопрос) – Emz

+0

Вы можете использовать поиск в регулярном выражении, что-то вроде 'set [a-z] *' должно это сделать, но вам придется вручную проверять результаты. Другой вариант - использовать что-то вроде checkstyle или PMD, чтобы найти кандидатов. –

ответ

0

Я думаю, вы должны использовать отражение и использовать регулярные выражения, чтобы соответствовать вашему случаю

public static void match(String name,String line) 
{ 

     String pattern = "("+name+".)([a-z][A-Z]\\w+)"; 
     // line = "private java.lang.String com.poc.Example.mName"; 
     // Create a Pattern object 
     Pattern r = Pattern.compile(pattern); 

     // Now create matcher object. 
     Matcher m = r.matcher(line); 
     if (m.find()) { 
     /* System.out.println("Found value: " + m.group(0)); 
     System.out.println("Found value: " + m.group(1)); 
     System.out.println("Found value: " + m.group(2));*/ 
     list.add(m.group(1)+m.group(2)); 
     } 
}  public static void getFields(String className) 
{ 
    //Field fields[]=a.getClass().getDeclaredFields(); 
    Field fields[]; 
    try { 
     fields = Class.forName(className).getDeclaredFields(); 
     for(Field f:fields) 
     { 
      //System.out.println(f.toString()); 
      match(className,f.toString()); 
     } 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }catch (ExceptionInInitializerError e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    catch (MissingResourceException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


} 

// Это мой код

public class Main { 
private static List<String> list = new ArrayList<String>(); 
private static List<String> name = new ArrayList<String>(); 

public static String getSubPackage(String packageName) { 
    try { 
     getClassNamesFromPackage(packageName); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (URISyntaxException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    packageName = packageName.replace("/", "."); 
    packageName = packageName.substring(0, packageName.lastIndexOf('.')); 
    return packageName; 
} 

public static List<String> getClassNamesFromPackage(String packageName) 
     throws IOException, URISyntaxException { 
    ClassLoader classLoader = Thread.currentThread() 
      .getContextClassLoader(); 
    URL packageURL; 

    packageName = packageName.replace(".", "/"); 

    packageURL = classLoader.getResource(packageName); 
    if (packageURL == null) 
     System.out.println(packageName); 
    if (new URI(packageURL.toString()) == null) 
     System.out.println(packageURL); 
    URI uri = new URI(packageURL.toString()); 

    File folder = new File(uri.getPath()); 
    // won't work with path which contains blank (%20) 
    // File folder = new File(packageURL.getFile()); 
    File[] content = folder.listFiles(); 
    // System.out.println(folder); 
    String entryName; 
    for (File actual : content) { 
     entryName = actual.getName(); 
     if (entryName.contains(".class")) { 
      // System.out.println(entryName); 
      // System.out.println(entryName.substring(0, 
      // entryName.lastIndexOf('.'))); 
      entryName = entryName.substring(0, entryName.lastIndexOf('.')); 

      // System.out.println(actual.getName()); 

      name.add(packageName.replace("/", ".") + "." + entryName); 
     } else { 
      if (!(entryName.contains(".xml")) 
        && !(entryName.contains(".properties")) 
        && !(entryName.contains(".wsdl")) 
        && !(entryName.contains(".mine")) 
        && !(entryName.contains(".r15857")) 
        && !(entryName.contains(".r15939"))) { 
       packageName = packageName.replace("/", "."); 
       packageName = packageName + "." + entryName; 
       packageName = getSubPackage(packageName); 
      } 
     } 

    } 

    return name; 
} 

public static void match(String name, String line) { 

    String pattern = "(" + name + ".)([a-z][A-Z]\\w+)"; 
    // line = "private java.lang.String com.poc.Example.mName"; 
    // Create a Pattern object 
    Pattern r = Pattern.compile(pattern); 

    // Now create matcher object. 
    Matcher m = r.matcher(line); 
    if (m.find()) { 
     /* 
     * System.out.println("Found value: " + m.group(0)); 
     * System.out.println("Found value: " + m.group(1)); 
     * System.out.println("Found value: " + m.group(2)); 
     */ 
     list.add(m.group(1) + m.group(2)); 
    } 

} 

public static void getFields(String className) { 
    // Field fields[]=a.getClass().getDeclaredFields(); 
    Field fields[]; 
    try { 
     fields = Class.forName(className).getDeclaredFields(); 
     for (Field f : fields) { 
      // System.out.println(f.toString()); 
      match(className, f.toString()); 
     } 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ExceptionInInitializerError e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (MissingResourceException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    // System.out.println(a.getClass().getName()); 

} 

@SuppressWarnings("rawtypes") 
public static void main(String[] args) throws Exception { 
    // TODO Auto-generated method stub 
    // Example a = new Example(); 
    // Example1 b = new Example1(); 

    // Class exmple = a.getClass().getDeclaredFields(); 
    String packageName = "com.oneassist"; 
    getClassNamesFromPackage(packageName); 
    System.out.println(name.size()); 
    Iterator<String> iterator = name.iterator(); 
    System.out.println(name); 
    String className = ""; 
    while (iterator.hasNext()) { 
     className = iterator.next(); 
     // Class act = Class.forName(packageName+"."+className); 
     // getFields(act); 

     // System.out.println(className); 
     /* 
     * Class cls = Class.forName(className); 
     * 
     * @SuppressWarnings("unchecked") Constructor ctor = 
     * cls.getConstructor(); Object object = ctor.newInstance(); 
     */ 

     // System.out.println(className); 
     getFields(className); 

    } 
    System.out.println(list); 
    System.out.println("size =" + list.size()); 
} 

}

0

Ну, теперь нет более простого способа изменить изменения. Рассматривали ли вы использование инструментов управления проектами, таких как git? Вы можете отменить то, что вы только что использовали, используя git или SVN.

На данный момент выполните поиск по клавишам Ctrl + H и найдите «setmFieldName». Теперь вы увидите пару вариантов. Выберите опцию «метод», «ограничение для всех вхождений» и отмените флажок «Библиотеки приложений» и «JRE» в параметрах поиска в java-поиске. Поиск вернет все вхождения.

0

Если вы работаете в Eclipse, вы можете перейти в Search-> File и поместить «getmFieldName» в поле «Содержит текст:» и «* .java» в поле «Шаблоны имен файлов». Это будет искать ваше рабочее пространство для файлов Java с текстом getMFieldName.

Кроме того, я не помню, делает ли это Eclipse это или нет, но с NetBeans и Intellij вы можете щелкнуть правой кнопкой мыши по классу или методу и выбрать опцию Find Usages.

Как в стороне, это не ошибка с Eclipse, а скорее проблема того, как изначально были названы методы. Кроме того, «getMFieldName» не является стандартным соглашением об именах. Обычно это будет getFieldName. Например, если переменная была цена, Java конвенция

getPrice() 

и

setPrice(double newPrice) 

getMPrice(), конечно, компиляции и запуска. Именно сейчас большинство программистов ожидают.