जितना अधिक मैंने इसकी शक्ति के बारे में सीखा है java.lang.reflect.AccessibleObject.setAccessible
, उतना ही चकित हूं कि मैं यह क्या कर सकता हूं। यह मेरे प्रश्न के उत्तर से अनुकूलित है ( स्थैतिक अंतिम File.separatorChar को इकाई परीक्षण के लिए बदलने के लिए प्रतिबिंब का उपयोग करके )।
import java.lang.reflect.*;
public class EverythingIsTrue {
static void setFinalStatic(Field field, Object newValue) throws Exception {
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
}
public static void main(String args[]) throws Exception {
setFinalStatic(Boolean.class.getField("FALSE"), true);
System.out.format("Everything is %s", false); // "Everything is true"
}
}
आप वास्तव में अपमानजनक सामान कर सकते हैं:
public class UltimateAnswerToEverything {
static Integer[] ultimateAnswer() {
Integer[] ret = new Integer[256];
java.util.Arrays.fill(ret, 42);
return ret;
}
public static void main(String args[]) throws Exception {
EverythingIsTrue.setFinalStatic(
Class.forName("java.lang.Integer$IntegerCache")
.getDeclaredField("cache"),
ultimateAnswer()
);
System.out.format("6 * 9 = %d", 6 * 9); // "6 * 9 = 42"
}
}
संभवत: एपीआई डिजाइनरों को एहसास है कि अपमानजनक कैसे setAccessible
हो सकता है, लेकिन यह माना है कि इसे प्रदान करने के लिए इसके वैध उपयोग हैं। तो मेरे सवाल हैं:
- वास्तव में वैध उपयोग क्या हैं
setAccessible
?- क्या जावा को इस तरह से डिज़ाइन किया गया है कि पहली जगह में इसकी आवश्यकता नहीं है?
- इस तरह के डिजाइन के नकारात्मक परिणाम (यदि कोई हो) क्या होगा?
- क्या आप
setAccessible
केवल वैध उपयोगों तक ही सीमित रह सकते हैं ?- के माध्यम से ही है
SecurityManager
?- यह कैसे काम करता है? श्वेतसूची / ब्लैकलिस्ट, ग्रेन्युलैरिटी, आदि?
- क्या आपके एप्लिकेशन में इसे कॉन्फ़िगर करना आम है?
- क्या मैं कॉन्फ़िगरेशन की
setAccessible
परवाह किए बिना अपनी कक्षाएं लिख सकता हूंSecurityManager
?- या मैं उस व्यक्ति की दया पर हूँ जो भी विन्यास का प्रबंधन करता है?
- के माध्यम से ही है
मुझे लगता है कि एक और महत्वपूर्ण सवाल है: क्या मुझे इस बारे में पता होना चाहिए ???
मेरी कक्षाओं में से किसी में भी लागू करने योग्य गोपनीयता का कोई जोड़ नहीं है। सिंगलटन पैटर्न (इसके गुणों के बारे में संदेह को अलग रखना) अब लागू करना असंभव है। जैसा कि ऊपर मेरे स्निपेट दिखाते हैं, यहां तक कि जावा मौलिक कार्यों की गारंटी के बारे में कुछ बुनियादी धारणाएं भी गारंटी होने के करीब नहीं हैं।
क्या ये समस्या सच नहीं हैं ???
ठीक है, मैंने अभी पुष्टि की है: धन्यवाद setAccessible
, जावा तार अपरिवर्तनीय नहीं हैं ।
import java.lang.reflect.*;
public class MutableStrings {
static void mutate(String s) throws Exception {
Field value = String.class.getDeclaredField("value");
value.setAccessible(true);
value.set(s, s.toUpperCase().toCharArray());
}
public static void main(String args[]) throws Exception {
final String s = "Hello world!";
System.out.println(s); // "Hello world!"
mutate(s);
System.out.println(s); // "HELLO WORLD!"
}
}
क्या मैं अकेला हूँ जो सोचता है कि यह एक बड़ी चिंता है?