سؤال

هذا هو شيء من هذا القبيل انعكاس حيث يمكنك استدعاء الأسلوب ببساطة عن طريق الاسم, و لا precompiled مؤشر على ذلك.

مثل جافا سكريبت يمكنك:

var fun = function(){    alert("Hello World!");    }
fun();

هو شيء مثل هذا ممكن في جافا/J2ME?كيف ؟

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

المحلول

إذا كنت تريد مترجم j2me, هل يمكن أن تحقق Hecl: http://www.hecl.org

أنت بالتأكيد لا تستطيع أن تفعل أكثر من 'الهوى' الأشياء التي يمكنك القيام به في الحالات العادية جافا في J2ME.البديل هو عبارة عن سلسلة من إذا/السيف هذا ثم استدعاء الدالة تريد ولكن عليك أن تعرف أنه في وقت مبكر بحيث يمكنك كتابة التعليمات البرمجية التي تفعل ذلك.

نصائح أخرى

وطريقة واحدة لتقليد هذه الوظيفة لإنشاء فئة الاستراتيجية.

interface Function
{
    Object call(Object[] arguments);
}

لتفعل ما اقترحتم، فلا تفعل ما يلي (أكثر قليلا مطول، وجافا عادة هو):

static class Fun implements Function
{
    public Object call(Object[] arguments)
    {
        System.out.println("Hello, world");
        return null;
    }
}

Function fun = new Fun();
fun.call(null);

واعتمادا على الحالة، قد تكون قادرا على استخدام أنواع الأدوية أو بدلا من Object وObject[] (في هذه الحالة، وأنا استخدمها لأقصى قدر من المرونة، لكنها لا تعطي كثيرا لك في طريق نوع التحقق حتى أفضل أنها ليست مثالية).

لمزيد من المعلومات، انظر إلى استراتيجية تصميم نمط .

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

Runnable r = new Runnable(){
    public void run(){
        System.out.println("Hello, world!");
    }
};
r.run(); // Prints "Hello, world!"

يمكنك حتى الإشارة المتغيرات في أرفق الطريقة ، إذا كانوا النهائي:

public static Runnable makeGreeter(final String who) {
    return new Runnable() {
        public void run() { 
            System.out.println("Hello, " + who + "!"); 
        }
    };
}

// ... elsewhere in your program...
Runnable r = makeGreeter("world");
r.run(); // "Hello, world!"

هذا هو معيار الاشياء التي كانت في جاوة منذ البداية. Runnable هو مفيد جدا واجهة التي ، وفقا Javadocs, "ينبغي أن تنفذ من قبل أي فئة من الحالات التي يراد تنفيذها من خلال موضوع". Runnable يمكن أن تستخدم في الكثير من المواضيع ، بالطبع ، و يستخدم عادة (في JVM وغيرها) بأنه "شيء التي يمكن تنفيذها" - الى حد كبير تشبه وظيفة في جافا سكريبت.بالطبع, إذا كنت تريد أن تمر الحجج سيكون لديك لجعل الخاصة بك واجهة ، ولكن تلك التي يمكن تنفيذها مجهول أيضا.على سبيل المثال, استخدام @Imagist هو Function واجهة:

interface Function {
    Object call(Object[] arguments);
}

// ...
Function helloSayer = new Function(){
    public Object call(Object[] args){
        System.out.println("Hello, " + args[0] + "!");
    }
};
helloSayer.call(new Object[]{ "world" }); // "Hello, world!"

تحرير: هذا لا علاقة له انعكاس, بالطبع, ولكن ليس هناك انعكاس في المثال الخاص بك إما مجرد وظيفة مجهول.

هل أنت بعد إنشاء الحيوية من طرق أو انعكاس ؟

والأول لا يمكنك أن تفعل في جاوة ولكن هل يمكن استخدام مترجم ( بيانشيل إذا تريد جافا).

وهناك ما لا يقل عن عدد قليل من الطرق:

هل يمكن إنشاء فصول في وقت التشغيل مع BCEL ، ولكن لديك لإنشاء bytecodes نفسك. والمدقق في JVM لقد رفض صفك إذا bytecodes تبدو مشكوك فيها. ليس حلا السوبر سهلة ولكن قابلة للتنفيذ.

وتنفيذ صن جافا 6 يشمل الكركدن أو المترجم جافا سكريبت، لذلك يمكنك ربما تفعل ما تحتاج إذا كنت على استعداد لاستخدام القليل من جافا سكريبت.

ولست متأكدا جدا عن هذا ولكن أعتقد إذا كان لديك JDK المثبتة، يمكنك استدعاء javac من برنامج Java الخاص بك. يمكن تحميل الانتاج javac لفي وقت التشغيل مع فئة ClassLoader المخصصة.

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