0Pricing
Java Academy · درس

معالجات التعليقات التوضيحية أثناء الترجمة

اكتب AbstractProcessor لإنشاء ملفات مصدر أو التحقق من التعليمات البرمجية أثناء الترجمة

معالجات التعليقات التوضيحية أثناء الترجمة درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

ما معالجات التعليقات التوضيحية؟

تعمل معالجات التعليقات التوضيحية (APT — Annotation Processing Tool) أثناء الترجمة. وهي تفحص التعليقات التوضيحية في الشيفرة المصدرية، ويمكنها إنشاء ملفات مصدر جديدة أو ملفات موارد، أو إصدار أخطاء وتحذيرات من المترجم.

AbstractProcessor: الفئة الأساسية

وسّع javax.annotation.processing.AbstractProcessor. وتجاوز process() لمعالجة العناصر التي تحمل تعليقات توضيحية. وأعلن عن التعليقات التوضيحية المدعومة وإصدار Java المصدر.

import javax.annotation.processing.*;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.*;

@SupportedAnnotationTypes("com.example.GenerateBuilder")
@SupportedSourceVersion(SourceVersion.RELEASE_17)
public class BuilderProcessor extends AbstractProcessor {
    @Override
    public boolean process(Set<? extends TypeElement> annotations,
                           RoundEnvironment roundEnv) {
        for (Element e : roundEnv.getElementsAnnotatedWith(GenerateBuilder.class)) {
            generateBuilder((TypeElement) e);
        }
        return true;
    }
    private void generateBuilder(TypeElement cls) { /* generate source */ }
}

تسجيل المعالج

سجّل المعالج في META-INF/services/javax.annotation.processing.Processor باستخدام اسم الفئة المؤهل بالكامل. وستكتشفه أدوات البناء (Maven وGradle) تلقائيًا.

# META-INF/services/javax.annotation.processing.Processor
com.example.BuilderProcessor

إنشاء ملفات المصدر

استخدم processingEnv.getFiler().createSourceFile() لكتابة ملف .java جديد. ثم يترجم المترجم الملف المُنشأ في الجولة نفسها أو الجولة التالية.

JavaFileObject file = processingEnv.getFiler()
    .createSourceFile("com.example.UserBuilder");
try (Writer w = file.openWriter()) {
    w.write("package com.example;\n");
    w.write("public class UserBuilder {\n");
    w.write("  // generated builder\n");
    w.write("}\n");
}

فحص نموذج العناصر

تعمل معالجات التعليقات التوضيحية مع عناصر من نوع Element (وليس فئات من نوع Class، لأن المصدر لم يُترجم بعد). استخدم TypeElement وVariableElement وExecutableElement.

TypeElement classElement = (TypeElement) element;
String className = classElement.getSimpleName().toString();
List<VariableElement> fields = classElement.getEnclosedElements().stream()
    .filter(e -> e.getKind() == ElementKind.FIELD)
    .map(e -> (VariableElement) e)
    .collect(Collectors.toList());

إصدار أخطاء المترجم

استدعِ processingEnv.getMessager().printMessage() لإصدار أخطاء أو تحذيرات أو ملاحظات. وهكذا تشير تعليقات التحقق التوضيحية المخصصة إلى المخالفات وقت الترجمة.

processingEnv.getMessager().printMessage(
    Diagnostic.Kind.ERROR,
    "@GenerateBuilder requires at least one field",
    element
);

المعالجة على جولات متعددة

تحدث معالجة التعليقات التوضيحية على جولات. فإذا أنشأت ملفًا يحتوي على تعليقات توضيحية، فقد يعمل المعالج مرة أخرى في الجولة التالية. وتشير roundEnv.processingOver() إلى الجولة الأخيرة.

if (roundEnv.processingOver()) {
    // last round — write summary files or do cleanup
}

Lombok من الداخل

يستخدم Lombok امتدادًا غير قياسي لـ APT يعدّل AST للفئات الموجودة (وهو أمر لا تسمح به المواصفة). وتنشئ تعليقاته التوضيحية مثل @Data و@Builder و@Getter الدوال مباشرةً داخل الفئة المترجمة.

إنشاء الشيفرة باستخدام MapStruct

ينشئ MapStruct تطبيقات مُعيِّنات آمنة من حيث النوع وقت الترجمة. فهو يقرأ الواجهات التي تحمل التعليق التوضيحي @Mapper ويكتب التطبيقات على هيئة فئات Java عادية، من دون أي انعكاس وقت التشغيل.

@Mapper
public interface UserMapper {
    UserDto toDto(User user);
    User toEntity(UserDto dto);
}
// MapStruct generates: UserMapperImpl.java at compile time

اختبار معالجات التعليقات التوضيحية

استخدم google/compile-testing أو Kapt (لـ Kotlin) لاختبار المعالجات اختبارًا وحداتيًا. مرّر سلاسل المصدر وتحقّق من الملفات المُنشأة أو أخطاء المترجم.

JavaFileObject src = JavaFileObjects.forSourceString("Test",
    "@GenerateBuilder public class Test { private String name; }");
Compilation c = Compiler.javac().withProcessors(new BuilderProcessor()).compile(src);
CompilationSubject.assertThat(c).succeeded();
CompilationSubject.assertThat(c).generatedSourceFile("TestBuilder");

تغليف المعالج

غلّف المعالج في وحدة Maven منفصلة. وتكون وحدة التعليقات التوضيحية (التي تحتوي على التعليقات فقط) اعتمادًا من نوع compile، أما وحدة المعالج فنطاقها annotationProcessor، ولا تكون اعتمادًا وقت التشغيل مطلقًا.

// build.gradle:
dependencies {
    implementation "com.example:my-annotations:1.0"
    annotationProcessor "com.example:my-processor:1.0"
}

تحقق سريع

أين تسجّل معالج التعليقات التوضيحية لاكتشافه تلقائيًا؟

مراجعة

وسّع AbstractProcessor، وسجّل المعالج في META-INF/services، وأنشئ المصدر باستخدام Filer، وأصدر الأخطاء باستخدام Messager. غلّف المعالجات في وحدات منفصلة. واستخدم compile-testing للاختبارات الوحدية. فهذا يلغي النفقات الإضافية للانعكاس وقت التشغيل.

الأسئلة الشائعة

هل درس «معالجات التعليقات التوضيحية أثناء الترجمة» مجاني؟

نعم — نص درس «معالجات التعليقات التوضيحية أثناء الترجمة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «معالجات التعليقات التوضيحية أثناء الترجمة»؟

اكتب AbstractProcessor لإنشاء ملفات مصدر أو التحقق من التعليمات البرمجية أثناء الترجمة تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «معالجات التعليقات التوضيحية أثناء الترجمة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تعريف التعليقات التوضيحية: العناصر والقيم الافتراضية
  2. سياسات الاحتفاظ وأنواع الأهداف
  3. معالجة التعليقات التوضيحية أثناء التشغيل
  4. معالجات التعليقات التوضيحية أثناء الترجمة
← العودة إلى Java Academy