2015-10-11 4 views
10

ऐसा लगता है कि एंड्रॉयड आवेदन वर्ग लोडर, उदाहरण के लिए सूर्य JDK classloader नहीं करता है, जबकि संजीदगी से एक (एक ऊपर उल्लिखित कक्षा में परिभाषित किया गया है की तुलना में) एक अलग पैकेज से भी एक पैकेज-निजी वर्ग के public static क्षेत्र के संदर्भ में प्राप्त करने के लिए अनुमति देता है 'टी।एंड्रॉइड क्लासलोडर पैकेज-प्राइवेट क्लास के सार्वजनिक क्षेत्र में किसी अन्य पैकेज से प्रतिबिंबित पहुंच की अनुमति क्यों देता है?

अधिक वस्तुतः, निम्नलिखित वर्ग परिभाषा दी:

package org.example.a 

class PackagePrivateClass { 
    public static final Parcelable.Creator<PackagePrivateClass> CREATOR = generateCreator(); 
} 

और एक अलग पैकेज में निम्न कोड:

package org.example.b 

public class TestClass { 
    public void testMethod() { 
     final Class classRef = Class.forName("org.example.a.PackagePrivateClass"); 
     final Field creatorFieldRef = classRef.getField("CREATOR"); 
     creatorFieldRef.get(null); // throws here (unless on Android) 
    } 
} 

जब सूर्य JVM पर निष्पादित यह अंतिम पंक्ति पर एक IllegalAccessException फेंकता है:

java.lang.IllegalAccessException: Class org.example.b.TestClass can not access a member of class org.example.a.PackagePrivateClass with modifiers "public static final" 
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102) 
... 

हालांकि, जब एक Android डिवाइस (5.1 Lollipo पर चलने पी FWIW) फेंक बिना निष्पादित करता है और creatorFieldRef.get(null) वास्तव में CREATOR क्षेत्र के लिए एक वैध संदर्भ देता है।

मेरा प्रश्न है: क्यों यह मामला है? क्या यह एक बग या एंड्रॉइड क्लासलोडर की सुविधा है ?? (या, यदि लागू हो, क्या मैं अपने उदाहरण में गलत मिला?)

उत्तर

2

लगता है कि यह एंड्रॉयड क्रम में एक बग जो इस commit में तय किया गया था:

विधि का उपयोग करने के चेकों जोड़ें और फील्ड प्रतिबिंब।

इस प्रतिबद्धता से पहले एक अप्रतिबंधित तरीके से प्रतिबिंब के माध्यम से फ़ील्ड तक पहुंचना संभव था या the value of final fields भी सेट करना संभव था।

एक्सेस चेक now रनटाइम फ़ंक्शन ValidateFieldAccess और ValidateAccess में लागू किया गया है।

+0

अच्छा पकड़ है, और प्रतिबद्ध कोड वास्तव में लगता है कि यह एक अलग पैकेज में गैर सरकारी वर्गों के क्षेत्रों के लिए उपयोग अस्वीकार होगा, लेकिन हालांकि पतों एक बग एआरटी के लिए विशिष्ट प्रतिबद्ध है और केवल (यह अर्थ पर लॉलीपॉप से ​​शामिल किया गया है चाहिए किटकैट एआरटी पर पुन: उत्पन्न), मेरे प्रश्न में नमूना कोड किसी भी एंड्रॉइड वीएम, डाल्विक और न ही (नवीनतम) एआरटी पर फेंक नहीं देता है। आपने मुझे विश्वास दिलाया कि यह एक बग हो सकता है, इसलिए मैंने एक [एओएसपी को जारी किया] [https://code.google.com/p/android/issues/detail?id=191727) सबमिट किया है, हम देखेंगे कि यह जानबूझकर है या नहीं या नहीं। धन्यवाद। – desseim

संबंधित मुद्दे

 संबंधित मुद्दे