Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [JAVA-ECLIPSE]ricerca codice morto(metodi non utilizzati) in applicazioni java SWING

    salve a tutti ragazzi,
    ho un problema un po rognoso da risolvere e cercavo un consiglio su come procedere. In pochissime parole il problema è il seguente:
    Sono uno studente della facoltà di informatica di Potenza è sto sviluppando un plugin di eclipse che analizza un qualsiasi progetto java dato in input e fornisce in outpout un elenco di tutti i metodi morti, inutilizzati, non richiamati da nessun altro frammento di codice.
    Per applicazioni non complesse (che non richiedano utilizzo di componenti swing o awt), il risultato è corretto al 100%. Il problema sorge quando analizzo un applicazione swing. Tra i metodi morti risultano infatti tutti, e dico tutti, gli actionPerformed , poichè effettivamente questi non vengono direttamente chiamati da nessun altro frammento di codice dell'applicazione, ma vengono chiamati dalla macchina virtuale a runtime in seguito allo scaturirsi di determinati eventi. L'analisi statica che effettuo non è quindi per il momento in grado di stabilire se un determinato actionPerformed sia effettivamente morto oppure no. Vorrei specificare che lavorando coneclipse e avendo creato un plugin, utilizzo naturalmente il package jdt che mi fornisce tipi come IProject, IMethod,IMethodBinding ecc, utilissimi per l'analisi e la modifica di progetti.
    Qualcuno di voi sarebbe in grado di darmi un consiglio su come individuare correttamente se un actionPerformed è morto o no?
    Io avevo pensato di ottenere da tutti i componenti swing dell'applicazione in analisi, la lista degli EventListeners registrati come gestori degli eventi generati da questi componenti, e di conseguenza individuare quali sono gli actionPerformed utilizzati o no. Un analisi più approfondita del problema mi ha portato a capire che questa lista potrei ottenerla solo a runtime, ma per le specifiche del mio progetto l'analisi deve essere statica.
    Qualche idea?
    vi ringrazio anticipatamente per l'attenzione
    maister

  2. #2
    Utente di HTML.it L'avatar di progAnd
    Registrato dal
    Jan 2012
    Messaggi
    119
    L'unica idea che mi viene in mente è questa: actionPerformed è un metodo che si trova nell'interfaccia ActionListener (se non erro). Quindi devi prendere il nome delle classi su cui il metodo è implementato (ocio che ci può essere di mezzo l'ereditarietà) e controllare in tutto il programma se:
    A) quella classe viene istanziata.
    B) per ogni oggetto così creato, vedere se quell'oggetto viene registrato all'interno di un gestore (addActionListener).

    Purtroppo vi sono diversi problemi da tener conto:
    1) Ereditarietà: una classe potrebbe usare actionPerformed perché deriva da una classe che implementa ActionListener
    2) Polimorfismo: potrei usare un oggetto che è in realtà un ActionListener od un suo derivato (AbstractAction, ad esempio)
    3) Vi sono dei metodi che implicitamente impostano il listener (il metodo setAction ed il relativo costruttore di un JButton, ad esempio)

    La cosa rischia di andare in esponenziale...

    Ciao

  3. #3
    progAnd, scusami per il mostruoso ritardo ma la situazione mi fa uscire di testa.
    Ti ringrazio per la risposta esaustiva, ma come hai detto anche tu, è evidente che la situazione potrebbe rtrasformarsi facilmente in un problema con variabili in crescita esponenziale.
    Detto questo c'è da dire che ci sono anche altri problemi, Ad esempio, nelle applicazioni che abbiamo studiato e creato all'uni si utilizzava la classe javax,swing.Action. Per ogni azione ci creavamo una classe che estendeva AbstractAction e implementavamo il metodo action performed. Una volta create tutte le azioni, creavamo oggetti di queste classi e li inserivamo in ua mappa delle azioni. Ogni volta che avevamo bisogno , per un determinato componente swing , di settare un ascoltatore, chiamavamo sul componente il metodo setAction(javax.swing.Action a), e come parametro passavamo una delle azioni prelevate dalla mappa delle Azioni. Come puoi vedere il Parametro è un Action generico che potrebbe (in analisi statica) corrispondere ad una qualsiasi delle azioni da me create.tra le altre cose a priori creo tutte le istanze delle azioni da me create e le metto nella mappaAzioni, ma poi potrei non utilizzarne qualcuna, e quindi il controllo sull'istanza della classe che implementa l'action performed non avrebbe a questo punto senso :-(.......
    Ho pensato ad un milione di soluzioni in questi giorni ma credo che per questo problema non esista soluzione.......:
    1. Avviare l'applicazione ed analizzare tramite il metodo getListeners dei componenti swing, quali fossero effettivamente le azioni istanziate (ma l'avvio di un applicazione swing comporterebbe l'aprirsi del frame principale che è una cosa orrenda mentre sto eseguendo il mio tool!!, tra le altre cose non tutti i componenti swing vengono creati e settati con il solo frame principale)
    2. Caricare tutte le classi della mia applicazione tramite un classloader da me creatoe analizzare il contenuto tramite la riflessione (ma non sono riuscito a trovare metodi più utili di quelli già forniti da JDT di Eclipse...)
    sono in una situazione disperata perchè credo che la cosa sia umanamente impossibile da risolvere....
    maister

  4. #4
    Utente di HTML.it L'avatar di progAnd
    Registrato dal
    Jan 2012
    Messaggi
    119
    Credo che, sinceramente, l'analisi statica di un programma "ad eventi" sia impossibile; gli alberi di copertura di codice non prevedono cambi di contesto in corso d'opera. Temo che dovrai lasciar perdere od eseguire un'analisi parziale; l'alternativa è analizzarlo in esecuzione, sperando che l'utente attivi tutte le opzioni possibili (il problema è analogo per il debug).

    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.