حيوي العثور على الفئة التي تمثل البدائية نوع جافا

StackOverflow https://stackoverflow.com/questions/180097

سؤال

أنا بحاجة إلى إجراء بعض تعكس طريقة المكالمات في جاوة.تلك المكالمات سوف تشمل الأساليب التي الحجج التي هي أنواع بدائية (int, double, الخ.).طريقة لتحديد هذه الأنواع عند البحث عن طريقة عاكس هو int.class, double.class ، وما إلى ذلك.

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

doSomething int double
doSomethingElse java.lang.String boolean

إذا كان الإدخال كان شيء من هذا القبيل java.lang.String, أنا أعلم أنني يمكن استخدام Class.forName("java.lang.String") إلى تلك الفئة سبيل المثال مرة أخرى.هل هناك أي طريقة لاستخدام هذا الأسلوب ، أو آخر ، للحصول على نوع بدائي الطبقات مرة أخرى ؟

تحرير: شكرا لجميع المشاركين.يبدو واضحا أن هناك المدمج في طريقة نظيفة أفعل ما أريد ، لذلك أنا سوف تسوية إعادة استخدام ClassUtils فئة من إطار الربيع.ويبدو أنها تحتوي على استبدال الطبقة.forName() التي سوف تعمل مع متطلبات بلدي.

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

المحلول

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

في حال كنت لا تحب أن يكون الاعتماد على الربيع:على شفرة المصدر من طريقة يمكن العثور على هـ.ز. هنا على مستودع العامة.الصف شفرة المصدر تحت رخصة أباتشي 2.0 نموذج.

ومع ذلك لاحظ أن يستخدم خوارزمية الثابت تلوينها الخريطة من أنواع بدائية.


تحرير: بفضل المعلقين Dávid هورفات وباتريك لافتا وصلة مكسورة.

نصائح أخرى

على Class الحالات البدائية أنواع يمكن الحصول عليها كما قال لك باستخدام على سبيل المثال int.class, ولكن من الممكن أيضا أن تحصل على نفس القيم استخدام شيء من هذا القبيل Integer.TYPE.كل بدائية فئة مجمع يحتوي على ساكنة المجال ، TYPE, التي لديها المقابلة البدائية فئة سبيل المثال.

لا يمكنك الحصول على بدائية الدرجة طريق forName, ولكن يمكنك الحصول عليه من الطبقة التي هي متاحة بسهولة.إذا كنت على الاطلاق ويجب استخدام انعكاس, يمكنك أن تجرب شيئا من هذا القبيل:

Class clazz = Class.forName("java.lang.Integer");
Class intClass = clazz.getField("TYPE").get(null);

intClass.equals(int.class);         // => true

ربما تحتاج فقط إلى رسم خريطة الأوليات و لبقية الطبقات أداء "forName" الطريقة:

وأود أن تفعل شيئا مثل:

void someWhere(){
     String methodDescription = "doSomething int double java.lang.Integer java.lang.String"
     String [] parts = methodDescription.split();
     String methodName= parts[0]
     Class [] paramsTypes = getParamTypes( parts ); // Well, not all the array, but a, sub array from 1 to arr.length..  

    Method m = someObject.class.getMethod( methodName, paramTypes );
    etc. etc etc.
}

public Class[] paramTypes( String [] array ){
     List<Class> list = new ArrayList<Class>();
     for( String type : array ) {
         if( builtInMap.contains( type )) {
             list.add( builtInMap.get( type ) );
          }else{
             list.add( Class.forName( type ) );
          }
     }
     return list.toArray();
}  

    // That's right.
Map<String,Class> builtInMap = new HashMap<String,Class>();{
       builtInMap.put("int", Integer.TYPE );
       builtInMap.put("long", Long.TYPE );
       builtInMap.put("double", Double.TYPE );
       builtInMap.put("float", Float.TYPE );
       builtInMap.put("bool", Boolean.TYPE );
       builtInMap.put("char", Character.TYPE );
       builtInMap.put("byte", Byte.TYPE );
       builtInMap.put("void", Void.TYPE );
       builtInMap.put("short", Short.TYPE );
}

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

"doSomething سلسلة نعم|لا"

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

راجع للشغل.لم يتم ترجمة التعليمات البرمجية أعلاه, ولكن أنا متأكد من أنه يعمل مع القليل من التعديلات لا أسفل التصويت لي على هذا.

أباتشي العموم لانج وقد ClassUtils.getClass(سلسلة), الذي يدعم أنواع بدائية.

عدد من أساليب الفئة لا تحمل الأوليات بطريقة متسقة للأسف.وهناك طريقة شائعة حول هذا في forName هو أن يكون هناك جدول مثل ؛

private static final Map<String, Class> BUILT_IN_MAP = 
    new ConcurrentHashMap<String, Class>();

static {
    for (Class c : new Class[]{void.class, boolean.class, byte.class, char.class,  
            short.class, int.class, float.class, double.class, long.class})
        BUILT_IN_MAP.put(c.getName(), c);
}

public static Class forName(String name) throws ClassNotFoundException {
    Class c = BUILT_IN_MAP.get(name);
    if (c == null)
        // assumes you have only one class loader!
        BUILT_IN_MAP.put(name, c = Class.forName(name));
    return c;
}

التعليمة البرمجية التالية محادثات حول كيفية الحصول على فئة من نوع بدائي من اسم الحقل هو معروف ، على سبيل المثالفي هذه الحالة 'sampleInt'.

public class CheckPrimitve {
    public static void main(String[] args) {
        Sample s = new Sample();
        try {
            System.out.println(s.getClass().getField("sampleInt").getType() == int.class); // returns true
            System.out.println(s.getClass().getField("sampleInt").getType().isPrimitive()); // returns true
        } catch (NoSuchFieldException e) {          
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }       
    }
}

class Sample {
    public int sampleInt;
    public Sample() {
        sampleInt = 10;
    }
}

واحدة يمكن أيضا التحقق من ما إذا كانت قيمة معينة هي بدائية أو لا عن طريق الحصول على انها منها المجمع الدرجة أو قيمة الحقل.

    public class CheckPrimitve {
        public static void main(String[] args) {
            int i = 3;
            Object o = i;
            System.out.println(o.getClass().getSimpleName().equals("Integer")); // returns true
            Field[] fields = o.getClass().getFields();
            for(Field field:fields) {
                System.out.println(field.getType()); // returns {int, int, class java.lang.Class, int}
            }
        }
    }

جوجل يقدم الجوافة com.google.common.primitives.Primitives هذا النوع من الاشياء.

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