এর শক্তি সম্পর্কে আমি যত বেশি শিখি java.lang.reflect.AccessibleObject.setAccessible
, ততই আমি আশ্চর্য হয়ে যাই যে এটি কী করতে পারে। এটি আমার প্রশ্নের উত্তর থেকে অভিযোজিত হয়েছে ( ইউনিট পরীক্ষার জন্য স্থির চূড়ান্ত ফাইল.সেস্পোর্টরচার পরিবর্তন করার প্রতিচ্ছবি ব্যবহার করে )।
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
?- বা আমি যে কনফিগারেশন পরিচালনা করে তার করুণায়?
- এর মাধ্যমেই কি হয়
আমি আরও একটি গুরুত্বপূর্ণ প্রশ্ন অনুমান করি: আমি কি এই সম্পর্কে খুব বেশি প্রয়োজন?
আমার ক্লাসগুলির কোনওটিরই প্রয়োগযোগ্য গোপনীয়তার কোনও নজির নেই what সিঙ্গলটন প্যাটার্ন (এর গুণাগুণ সম্পর্কে সন্দেহ রেখে) এখন কার্যকর করা অসম্ভব। আমার উপরের স্নিপেটগুলি যেমন দেখায়, জাভা মৌলিক কাজগুলি কীভাবে গ্যারান্টিযুক্ত হওয়ার কাছাকাছি নয় তার কিছু প্রাথমিক ধারণাও।
এই সমস্যাগুলি কি বাস্তব নয় ???
ঠিক আছে, আমি কেবল নিশ্চিত করেছি: ধন্যবাদ 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!"
}
}
আমি কি কেবলমাত্র এই ব্যক্তিটিকেই একটি বিশাল উদ্বেগ বলে মনে করি?