Προγραμματισμός

Ανάλυση πηγαίου κώδικα χρησιμοποιώντας Java 6 API

από τη Seema Richard, Deepa Sobhana

Έχετε σκεφτεί ποτέ πώς εργαλεία όπως το Checkstyle ή το FindBugs εκτελούν ανάλυση στατικού κώδικα ή πώς τα ολοκληρωμένα περιβάλλοντα ανάπτυξης (IDE) όπως το NetBeans ή το Eclipse εκτελούν γρήγορες διορθώσεις κώδικα ή βρείτε τις ακριβείς αναφορές ενός πεδίου που δηλώνεται στον κώδικα σας Σε πολλές περιπτώσεις, τα IDE έχουν τα δικά τους API για να αναλύσουν τον πηγαίο κώδικα και να δημιουργήσουν μια τυπική δομή δέντρου, που ονομάζεται Abstract Syntax Tree (AST) ή "parse tree", το οποίο μπορεί να χρησιμοποιηθεί για βαθύτερη ανάλυση των στοιχείων προέλευσης. Τα καλά νέα είναι ότι είναι πλέον δυνατή η ολοκλήρωση των εν λόγω εργασιών και πολλά περισσότερα με τη βοήθεια τριών νέων API που εισήχθησαν στην Java ως μέρος της έκδοσης Java Standard Edition 6. Τα API που μπορεί να ενδιαφέρουν τους προγραμματιστές εφαρμογών Java που πρέπει να πραγματοποιήσουν ανάλυση πηγαίου κώδικα είναι το Java Compiler API (JSR 199), το Pluggable Annotation Processing API (JSR 269) και το Compiler Tree API.

Σε αυτό το άρθρο, διερευνούμε τις δυνατότητες καθενός από αυτά τα API και συνεχίζουμε να αναπτύσσουμε μια απλή εφαρμογή επίδειξης που επαληθεύει ορισμένους κανόνες κωδικοποίησης Java σε ένα σύνολο αρχείων πηγαίου κώδικα που παρέχονται ως είσοδος. Αυτό το βοηθητικό πρόγραμμα εμφανίζει επίσης τα μηνύματα παραβίασης κωδικοποίησης καθώς και τη θέση του παραβιασμένου πηγαίου κώδικα ως έξοδο. Εξετάστε μια απλή κλάση Java που παρακάμπτει τη μέθοδο ίσο () της κλάσης αντικειμένων. Ο κανόνας κωδικοποίησης που πρέπει να επαληθευτεί είναι ότι κάθε κλάση που εφαρμόζει τη μέθοδο ίσο () θα πρέπει επίσης να παρακάμψει τη μέθοδο hashcode () με την κατάλληλη υπογραφή. Μπορείτε να δείτε ότι η κλάση TestClass παρακάτω δεν καθορίζει τη μέθοδο hashcode (), παρόλο που έχει τη μέθοδο ίσο ().

Δημόσια τάξη TestClass υλοποιεί Serializable {int num; @ Override public boolean ισούται με (Object obj)} 

Ας συνεχίσουμε και αναλύσουμε αυτήν την τάξη ως μέρος της διαδικασίας κατασκευής με τη βοήθεια αυτών των τριών API.

Επίκληση του μεταγλωττιστή από τον κώδικα: Το Java Compiler API

Όλοι χρησιμοποιούμε το javac εργαλείο γραμμής εντολών για τη σύνταξη αρχείων προέλευσης Java σε αρχεία κλάσης. Τότε γιατί χρειαζόμαστε ένα API για τη σύνταξη αρχείων Java; Λοιπόν, η απάντηση είναι αρκετά απλή: όπως περιγράφει το όνομα, αυτό το νέο πρότυπο API μας επιτρέπει να καλέσουμε τον μεταγλωττιστή από τις δικές μας εφαρμογές Java. Δηλαδή, μπορείτε να αλληλεπιδράτε μέσω προγραμματισμού με τον μεταγλωττιστή και έτσι να κάνετε τη συλλογή μέρος υπηρεσιών σε επίπεδο εφαρμογής. Ορισμένες τυπικές χρήσεις αυτού του API παρατίθενται παρακάτω.

  • Το API του μεταγλωττιστή βοηθά τους διακομιστές εφαρμογών να ελαχιστοποιήσουν τον χρόνο που απαιτείται για την ανάπτυξη εφαρμογών, για παράδειγμα, αποφεύγοντας την επιβάρυνση της χρήσης εξωτερικού μεταγλωττιστή για τη μεταγλώττιση των πηγών servlet που δημιουργούνται από τις σελίδες JSP.

  • Τα εργαλεία προγραμματιστών όπως τα IDE και οι αναλυτές κώδικα μπορούν να καλέσουν τον μεταγλωττιστή μέσα από τον επεξεργαστή ή να δημιουργήσουν εργαλεία που μειώνουν σημαντικά το χρόνο μεταγλώττισης.

Οι κλάσεις μεταγλωττιστή Java συσκευάζονται κάτω από το javax.tools πακέτο. ο Παροχέας εργαλείων κλάση αυτού του πακέτου παρέχει μια μέθοδο που ονομάζεται getSystemJavaCompiler () που επιστρέφει μια παρουσία κάποιας κλάσης που εφαρμόζει το JavaCompiler διεπαφή. Αυτή η παρουσία μεταγλωττιστή μπορεί να χρησιμοποιηθεί για τη δημιουργία μιας εργασίας σύνταξης που θα εκτελεί την πραγματική συλλογή. Τα αρχεία προέλευσης Java που πρόκειται να μεταγλωττιστούν θα μεταφερθούν στη συνέχεια στην εργασία σύνταξης. Για αυτό, το API του μεταγλωττιστή παρέχει μια αφαίρεση διαχειριστή αρχείων που ονομάζεται JavaFileManager, το οποίο επιτρέπει την ανάκτηση αρχείων Java από διάφορες πηγές, όπως το σύστημα αρχείων, βάσεις δεδομένων, μνήμη και ούτω καθεξής. Σε αυτό το δείγμα, χρησιμοποιούμε StandardFileManager, ένας διαχειριστής αρχείων με βάση java.io. Αρχείο. Ο τυπικός διαχειριστής αρχείων μπορεί να αποκτηθεί καλώντας το getStandardFileManager () μέθοδος του JavaCompiler παράδειγμα. Το απόσπασμα κώδικα για τα παραπάνω βήματα εμφανίζεται παρακάτω:

// Λάβετε μια παρουσία του java compiler JavaCompiler compiler = ToolProvider.getSystemJavaCompiler (); // Λάβετε μια νέα παρουσία της εφαρμογής τυπικού διαχειριστή αρχείων StandardJavaFileManager fileManager = μεταγλωττιστή. getStandardFileManager (null, null, null); // Λάβετε τη λίστα αντικειμένων αρχείων java, στην περίπτωση αυτή έχουμε μόνο ένα // αρχείο, TestClass.java Iterable compilationUnits1 = fileManager.getJavaFileObjectsFromFiles ("TestClass.java"); 

Ένας διαγνωστικός ακροατής μπορεί προαιρετικά να περάσει στο getStandardFileManager () μέθοδος για τη δημιουργία διαγνωστικών αναφορών τυχόν μη θανατηφόρων προβλημάτων. Σε αυτό το απόσπασμα κώδικα, περνάμε μηδενικό τιμές, καθώς δεν συλλέγουμε τα διαγνωστικά από το εργαλείο. Για λεπτομέρειες σχετικά με τις άλλες παραμέτρους που μεταβιβάζονται σε αυτές τις μεθόδους, ανατρέξτε στο Java 6 API. ο getJavaFileObjectsfromFiles () μέθοδος του StandardJavaFileManager επιστρέφει όλα τα JavaFileObject παρουσίες που αντιστοιχούν στα παρεχόμενα αρχεία προέλευσης Java.

Διαβάστε το υπόλοιπο αυτού του άρθρου

Αυτή η ιστορία, "Ανάλυση πηγαίου κώδικα χρησιμοποιώντας Java 6 API" δημοσιεύθηκε αρχικά από το JavaWorld.