English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

ملاحظات تطبيق Java Reflection في العمل

واجهت هذا المشكلة مؤخرًا في العمل:

صنع أدوات اختبار لجميع واجهات البرمجة لمشروع معين، باستخدام تقنية Java Swing، ويختلف هذا المشروع عن إصدار إلى آخر، وليس كل واجهة برمجة متطابقة في جميع الإصدارات، ويحتاج أداتي إلى التكامل مع جميع الإصدارات.

إذًا يُحدث هذا المشكلة:

إذا كانت بعض واجهات البرمجة غير موجودة في بعض الإصدارات، فإن تنفيذ هذه العملية من خلال واجهة المستخدم سيتسبب في عرض خطأ، لذا من أجل التكامل مع جميع الإصدارات، يجب النظر في وجود الطريقة قبل إجراء الاتصال بها، وكذلك لتجنب رفع استثناءات عند التجميع، عند إجراء الاتصال بالطريقة

يحتاج أيضًا إلى تلقيح للإستدعاء، وتحقق التحقق التالي:

أولاً: استخدام التلقيح لتحديد ما إذا كانت الطريقة موجودة أم لا

/**
   * تحديد ما إذا كانت الطريقة موجودة أم لا
   *
   * @param obj نموذج JObjectService
   * @param methodName اسم الطريقة
   * @param paraTypes مجموعة أنواع المعلمات النمطية للطريقة
   * @return
   */
  public static boolean judgeMethodIsExist(Object obj, String methodName, Class[] paraTypes) {
    boolean result = true;
    try {
      if (null != obj) {
        Method method = obj.getClass().getMethod(methodName, paraTypes);
      {}
    }
      showWarnInfo(ex.toString());
      log.error("حدثت استثناء في: " + MainJFrame.hostName + "؛ التفاصيل الكاملة: " + ex.getMessage());
      result = false;
    {}
    return result;
  {}

شرح المعلمات:

(1)obj: يمثل الكائن الذي سيتم استدعاء الطريقة به

(2)methodName: اسم الطريقة التي سيتم استدعاؤها

(3)paraTypes: نوع المعلمات المطلوبة للطريقة (مرة أخرى يكونوا كإعدادت)

من خلال هذه الطريقة، يمكنك التحقق مما إذا كانت الطريقة methodName (نوع المعلمات) التي يتم استدعاؤها من خلال obj موجودًا، وإذا لم تكن موجودة، سيتم إطلاق استثناء NoSuchMethodException

ثانيًا، من خلال استدعاء الطريقة عبر الت反射، لتجنب الاستثناءات عند التجميع

sysUser = MainJFrame.getSysUser();
    Class[] paramObj = {String.class, long.class, String.class, String.class, int.class}; // 判断方法是否存在
    boolean isExist = CommonUtil.judgeMethodIsExist(sysUser, "createBucket", paramObj);
    if (isExist) {
      try { // 通过反射调用方法
        Class clazz = sysUser.getClass(); // 方法名称--方法中参数的类型(按参数顺序)
        Method createBucket = clazz.getDeclaredMethod("createBucket", String.class, long.class, String.class, String.class, int.class);
        int create = (int) createBucket.invoke(sysUser, bucketName, Long.parseLong(bucketSize), bucketLoc, bucketAcl, Integer.parseInt(StringUtil.emptyToZero(bucketCycle)));
        if (create == 1) {
          CommonUtil.showInfo("Bucket创建成功");
          log.info("Bucket创建成功");
        } else {
          CommonUtil.showWarnInfo("Bucket创建失败,服务器内部错误!");
          log.info("Bucket创建失败,服务器内部错误");
        {}
      } catch (Exception ex) {
        CommonUtil.showWarnInfo(ex.getMessage());
        log.error("حدثت استثناء في: " + MainJFrame.hostName + "؛ التفاصيل الكاملة: " + ex.getMessage());
      {}
    {}

في الكود أعلاه:

السطر الأول: العنصر الذي يتم استدعاء طريقة createBucket منه sysUser

السطر الثاني: يتم استخدام مجموعة أنواع المعلمات في الطريقة لتحديد ما إذا كانت الطريقة موجودة أم لا

السطر الثالث: يتم التحقق من وجود الطريقة من خلال العنصر، اسم الطريقة ومجموعة أنواع المعلمات

من خلال هذه الثلاثة سطور، إذا كان موجوداً فإنه سيتم تنفيذ المهام التالية، وإذا لم يكن موجوداً فإنه سيتم عرض رسالة استثناء

السطر السادس: الحصول على Class للعنصر

السطر السابع: الحصول على Method للعنصر، المعلمات هي اسم الطريقة والنوع الم对应 للمعلمات

السطر الثامن: يتم استدعاء方法 createBucket من خلال Method باستخدام Method، والمعلمات هي sysUser والمعلمات (القيم) المطلوبة

من خلال الطرق المذكورة أعلاه، حتى إذا لم يكن هناك أي واجهة في العنصر، لن يحدث استثناء في وقت التجميع.

حقاً، هذا هو المرة الأولى التي واجهت فيها مشكلة في آلية الت反射 في مشروعي الخاص، من الضروري تسجيل ذلك!

الخلاصة

هذا هو محتوى المقال الكامل حول تطبيق آلية الت反射 في العمل اليومي، نأمل أن يكون مفيداً لكم. يمكن للزوار المهتمين الاستمرار في مراجعة هذا الموقع:

تعليم آلية الت反射 في Java بسيطة

عن آلية الت反射 في Java، الأشياء التي تحتاج إلى معرفتها

إذا كان هناك نقص، فنحن نرحب بتعليقاتك. شكراً للأصدقاء على دعم هذا الموقع!

بيان: محتوى هذا المقال تم جمعه من الإنترنت، حقوق الطبع محفوظة للمالك الأصلي، تم جمع المحتوى من قبل المستخدمين عبر الإنترنت بطرقهم الخاصة، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل أي مسؤولية قانونية. إذا كنت قد وجدت محتوى يشتبه في انتهاك حقوق النسخ، فنرجو منك إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # ب @) لإبلاغنا، وتقديم الدليل على ذلك، وإذا تم التحقق من ذلك، فإن هذا الموقع سيقوم بإزالة المحتوى المزعوم بسرعة.

أنت قد تحب