سؤال

إذا كان لدي أسماء وظيفية مخزنة كسلاسل في علامة التصنيف.
هل هناك طريقة للوصول إلى الوظائف عبر السلاسل المخزنة؟

تحرير أخشى أن المنصة التي أعمل عليها على cldc1.1/midp2.0 لا تدعم الانعكاس.
أي حل بديل ممكن؟

هل كانت مفيدة؟

المحلول

ما عليك سوى استخدام قائمة طويلة طويلة من غيرها:

[...]
} else if ("foo".equals(function)) {
    target. foo();
} else if ("bar".equals(function)) {
    target. bar();
[...]

(على الرغم من أنني عمومًا لا أحب محاولة التوافق الرأسي في المصدر ، إلا أنني أعتقد في مثل هذه الحالات أنه يستحق ذلك.)

يعد تخزين functor في الخريطة بديلاً ، وقد يزيد BU من حجم الكائنات كثيرًا للعديد من تطبيقات MIDP.

نصائح أخرى

يجب أن يكون هناك class.forname () و newinstance () على منتصف 1.1 وقد يكون مفيدًا. نظرًا لأنه ليس لديك انعكاس كامل ، يمكنك إنشاء فئة تلتف جميع مكالمات الوظائف وتستدعيها. هذا يفترض أنك تعرف جميع مكالمات الوظائف مقدمًا.

ستحتاج إلى إشارات إلى جميع الكائنات إلا إذا كنت تقوم بإجراء مكالمات ثابتة. كيندا فوضوي ، ولكن سوف تنجز المهمة.

public Object invoke(String name, Object[] args) {
   Object f = functionMap.get(name);
   if("f1".equals(name)) {
       return ((SomeInterface1)f).someFunction1((SomeArg0) args[0]), ...);
   } else if ("f2".equals(name)) {
       return ((SomeInterface2)f).someFunction2((SomeArg0) args[0]), ...);
   }...{
   } else if ("fN".equals(name)) {
       return ((SomeInterfaceN)f).someFunctionN((SomeArg0) args[0]), ...);
   }
}

بالنظر إلى اسم وظيفة ، يمكنك استخدام الانعكاس للوصول إلى الطريقة. إلى جانب اسم الوظيفة ، تحتاج إلى معرفة فئتها ، وأن يكون لديك (أو إنشاء عن طريق التفكير إذا كان لديه مُنشئ noarg أو كنت تعرف المعلمات التي يجب أن تنتقل إلى المُنشئ) مثيلًا (إذا كانت الطريقة غير ثابتة) وأنت يجب أن تعرف المعلمات المطلوبة لتمريرها.

خيار آخر هو استخدام فئة الطريقة كمؤشر للوظيفة. لديها ميزة معرفة فئتها ، ومعرفة متطلبات المعلمات. لديها عيب عدم التسلسل.

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

لم أحاول التفكير في Javame ، ولكن على Javase يمكنك استخدام التأمل لاستدعاء طريقة ديناميكية.

المقتطف التالي مأخوذ من:http://java.sun.com/developer/technicalarticles/alt/reflection/

import java.lang.reflect.*;

الفئة العامة method2 {public int add (int a ، int b) {return a + b ؛ }

  public static void main(String args[])
  {
     try {
       Class cls = Class.forName("method2");
       Class partypes[] = new Class[2];
        partypes[0] = Integer.TYPE;
        partypes[1] = Integer.TYPE;
        Method meth = cls.getMethod(
          "add", partypes);
        method2 methobj = new method2();
        Object arglist[] = new Object[2];
        arglist[0] = new Integer(37);
        arglist[1] = new Integer(47);
        Object retobj 
          = meth.invoke(methobj, arglist);
        Integer retval = (Integer)retobj;
        System.out.println(retval.intValue());
     }
     catch (Throwable e) {
        System.err.println(e);
     }
  }

}

تحرير: بدلاً من استخدام if..hen..else قد ترغب في نقل رقم بالفعل ، واستخدام مفتاح ، لأنه سيكون من الأسهل قراءته ، IMO.

ولكن ، بغض النظر ، ربما يكون هذا هو خيارك الوحيد بالنظر إلى قيود Javame.

أتعامل مع قضايا مماثلة في HECL, ، مترجم يمتد على j2me. يعتمد هذا النوع على عدد الأوتار التي تريد التعامل معها ، ولكن إحدى الطرق التي تعمل هي استخدام التجزئة للبحث عن عدد صحيح ، ثم استخدام ذلك في بيان التبديل ، بدلاً من القائمة الكبيرة للبيانات إذا/ثم. بالمناسبة ، مرحبًا بك في استخدام رمز مصدر HECL ؛ إنه متوفر بموجب ترخيص Apache الليبرالي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top