একটি অবৈধ প্রতিফলিত অ্যাক্সেস কি


126

জাভা 9-তে অবৈধভাবে প্রতিফলিত অ্যাক্সেস সম্পর্কে প্রায় অনেক প্রশ্ন রয়েছে।

এখন আমি যা খুঁজে পাচ্ছি না কারণ সমস্ত গুগল স্পীস আপ করে তারা হ'ল লোকেরা ত্রুটি বার্তাগুলি ঘিরে কাজ করার চেষ্টা করছে, এটিই একটি অবৈধ প্রতিফলিত অ্যাক্সেস আসলে।

সুতরাং আমার প্রশ্নটি মোটামুটি সহজ:

কোনটি একটি অবৈধ প্রতিফলিত অ্যাক্সেসকে সংজ্ঞায়িত করে এবং কোন পরিস্থিতিতে সতর্কবার্তাটি ট্রিগার করে?

আমি জড়ো করে ফেলেছি যে এটি জাভা 9-এ প্রবর্তিত এনক্যাপসুলেশন নীতিগুলির সাথে কিছু করার আছে তবে কীভাবে এটি সমস্ত একসাথে স্তব্ধ হয়ে যায় এবং কী পরিস্থিতিতে আমি কী ব্যাখ্যা করতে পারি না সে সম্পর্কে সতর্কবার্তাটি কীভাবে ট্রিগার করে।


উত্তর:


54

মডিউল এবং তাদের স্ব স্ব প্যাকেজগুলির মধ্যে অ্যাক্সেসগুলির বোঝার বাইরে। আমি বিশ্বাস করি এর মূদ্রাটি মডিউল সিস্টেম # রিল্যাক্সড-স্ট্রং-এনক্যাপসুলেশনের মধ্যে রয়েছে এবং আমি প্রশ্নের প্রাসঙ্গিক চেষ্টা ও উত্তর দেওয়ার জন্য কেবল এর সম্পর্কিত অংশগুলি চেরি-বাছাই করব।

কোনটি একটি অবৈধ প্রতিফলিত অ্যাক্সেসকে সংজ্ঞায়িত করে এবং কোন পরিস্থিতিতে সতর্কবার্তাটি ট্রিগার করে?

জাভা -9 এ মাইগ্রেশনে সহায়তা করার জন্য, মডিউলগুলির শক্তিশালী এনক্যাপসুলেশন শিথিল করা যেতে পারে।

  • একটি বাস্তবায়ন স্থির অ্যাক্সেস প্রদান করতে পারে , যেমন বাইকোড সংকলিত দ্বারা।

  • এর অন -টাইম সিস্টেমে এক বা একাধিক মডিউলগুলির এক বা একাধিক প্যাকেজগুলির সাথে সমস্ত নামবিহীন মডিউলগুলিতে কোডের জন্য খোলা অর্থাত্ ক্লাসপথের কোডে একটি উপায় সরবরাহ করতে পারে। যদি রান-টাইম সিস্টেমটি এভাবে আহ্বান করা হয় এবং যদি তা করে প্রতিফলন APIs এর কিছু অনুরোধ সফল হয় যেখানে অন্যথায় তারা ব্যর্থ হত।

এই ধরনের ক্ষেত্রে, আপনি আসলে একটি প্রতিফলিত অ্যাক্সেস তৈরি শেষ করেছেন যা "অবৈধ" যেহেতু খাঁটি মডুলার জগতে আপনি এই ধরণের অ্যাক্সেসগুলি করতে চাননি।

কীভাবে এটি সমস্ত একসাথে স্তব্ধ হয়ে যায় এবং কোন দৃশ্যে সতর্কবার্তাটি ট্রিগার করে?

এনক্যাপসুলেশনের এই শিথিলকরণটি রানটাইম সময়ে একটি নতুন লঞ্চার বিকল্প দ্বারা নিয়ন্ত্রিত হয় --illegal-accessযা জাভা 9 সমানতে ডিফল্টরূপে হয় permitpermitমোড নিশ্চিত

এই জাতীয় কোনও প্যাকেজে প্রথম প্রতিফলিত-অ্যাক্সেস অপারেশনের কারণে একটি সতর্কতা জারি করা হয়, তবে সেই বিন্দুটির পরে কোনও সতর্কতা জারি করা হয় না। এই একক সতর্কতাটি আরও সতর্কতাগুলি কীভাবে সক্ষম করবেন তা বর্ণনা করে। এই সতর্কতা দমন করা যায় না।

মোডগুলি মানগুলি debug(যেমন প্রতিটি অ্যাক্সেসের জন্য বার্তা পাশাপাশি স্ট্যাকট্রেস), warn(প্রতিটি এই অ্যাক্সেসের জন্য বার্তা) এবং deny(যেমন ক্রিয়াকলাপ অক্ষম করে) দিয়ে কনফিগার করা যায় ।


অ্যাপ্লিকেশনগুলিতে ডিবাগ এবং ঠিক করার জন্য কয়েকটি জিনিস হ'ল: -

  • এ জাতীয় নির্দেশনা ( ) বা স্পষ্টভাবে ব্যবহার সহ মডিউল ঘোষণা ছাড়াই একটি মডিউল থেকে অন্য মডিউল থেকে অন্য প্যাকেজগুলি খুলতে--illegal-access=deny এড়াতে এটি চালিয়ে যান Runopens--add-opens ভিএম আরগের ।
  • সংকলিত কোড থেকে জেডিকে-অভ্যন্তরীণ এপিআইগুলিতে স্থিতিক উল্লেখগুলি বিকল্পটির সাহায্যে jdepsসরঞ্জামটি ব্যবহার করে সনাক্ত করা যেতে পারে--jdk-internals

যখন অবৈধ প্রতিফলন-অ্যাক্সেস অপারেশন সনাক্ত করা হয় তখন সতর্কতা বার্তাটি জারি করে নিম্নলিখিত ফর্মটি রয়েছে:

WARNING: Illegal reflective access by $PERPETRATOR to $VICTIM

কোথায়:

$PERPETRATOR কোড সহ এমন ধরণের পুরোপুরি যোগ্যতাসম্পন্ন নাম যা প্রশ্নে প্রতিফলনমূলক ক্রিয়াকলাপটি যোগ করে কোড উত্সের (যেমন, জেআর-ফাইলের পাথ) যদি উপলভ্য থাকে, এবং

$VICTIM এমন একটি স্ট্রিং যা পরিবেষ্টনের ধরণের পুরোপুরি যোগ্যতার নাম সহ সদস্যকে অ্যাক্সেস করা হচ্ছে বলে বর্ণনা করে

যেমন একটি নমুনা সতর্কতা জন্য প্রশ্ন: = জেডিকে 9: একটি অবৈধ প্রতিফলিত অ্যাক্সেস অপারেশন ঘটেছে। org.python.core.PySystemState

সর্বশেষ এবং একটি গুরুত্বপূর্ণ নোট, আপনি যাতে এই ধরনের সতর্কতার মুখোমুখি না হন এবং ভবিষ্যতে সুরক্ষিত হন তা নিশ্চিত করার চেষ্টা করার সময়, আপনাকে যা করতে হবে তা হ'ল আপনার মডিউলগুলি যে অবৈধ প্রতিফলিত প্রবেশাধিকার না করে তা নিশ্চিত করা উচিত। :)


21

আমি জাভা 9 মডিউল সিস্টেম সম্পর্কিত একটি ওরাকল নিবন্ধ পেয়েছি

ডিফল্টরূপে, মডিউলে থাকা কোনও প্রকার অন্য মডিউলগুলির কাছে অ্যাক্সেসযোগ্য না হয় যদি না এটি সর্বজনীন প্রকার হয় এবং আপনি এর প্যাকেজটি রফতানি করেন। আপনি যে প্যাকেজগুলি প্রকাশ করতে চান তা আপনি প্রকাশ করেন exp জাভা 9 এর সাথে এটি প্রতিবিম্বের ক্ষেত্রেও প্রযোজ্য।

Https://stackoverflow.com/a/50251958/134894 তে নির্দেশিত হিসাবে , AccessibleObject#setAccessibleJDK8 এবং JDK9 এর জন্য পার্থক্য শিক্ষণীয়। বিশেষত, জেডিকে 9 যুক্ত হয়েছে

এই পদ্ধতিটি ক্লাস সি-এর একজন আহ্বানকারী ডি ক্লাস ডি ঘোষণার সদস্যের অ্যাক্সেস সক্ষম করতে নীচের যে কোনও একটি ব্যবহার করে ব্যবহার করতে পারেন:

  • সি এবং ডি একই মডিউলে।
  • সদস্যটি সর্বজনীন এবং ডি এমন একটি প্যাকেজে সর্বজনীন যে মডিউলটি অন্তত সি যুক্ত মডিউলটিতে রফতানি করে
  • সদস্যটি অবিচলিত সুরক্ষিত, ডি এমন একটি প্যাকেজে প্রকাশ্য যে মডিউলটি অন্তত সি যুক্ত মডিউলটিতে রফতানি করে, এবং সি ডি এর একটি সাবক্লাস exports
  • ডি একটি প্যাকেজের মধ্যে রয়েছে যা ডি যুক্ত মডিউলটি অন্তত সি অন্তর্ভুক্ত মডিউলটি খোলায় নামবিহীন ও খোলা মডিউলগুলির সমস্ত প্যাকেজ সমস্ত মডিউলের জন্য উন্মুক্ত এবং তাই যখন ডি নামবিহীন বা খোলা মডিউলে থাকে তখন এই পদ্ধতিটি সর্বদা সফল হয়।

যা মডিউলগুলির তাত্পর্য এবং তাদের রফতানি (জাভা 9 এ) হাইলাইট করে


2
সুতরাং আমি যদি নিবন্ধটি রফতানি ক্লাসে ব্যক্তিগত সম্পত্তিগুলি সঠিকভাবে সংশোধন করি তা টেবিলে বন্ধ। কেবল সুরক্ষিত এবং সর্বজনীন বৈশিষ্ট্যগুলি সংশোধন করা যেতে পারে। এখন আমি জাভা অভ্যন্তরীণ রফতানীর বিষয়ে খুব বেশি যত্ন নিই না, তবে তৃতীয় পক্ষের লাইব্রেরিগুলিতে যেখানে আমার মাঝে মাঝে একটি নির্দিষ্ট ভ্যালুতে একটি নির্দিষ্ট মান সেট করতে প্রয়োজন হয় private এই স্কিমটিতে এটি আর সম্ভব হবে না যদি এটি নিজেকে মডিউল হিসাবে সংজ্ঞায়িত করে, এটি কি সঠিক?
চ্যাশাল্লাকা

1
এর সাথে আমার সরাসরি অভিজ্ঞতা নেই তবে এটি আমার বোঝাপড়া হবে এবং অন্যত্র উল্লিখিত নিবন্ধের পাশাপাশি পড়বেন ( jaxenter.com/jdk-9-replace-permit-illegal-access-134180.html ) যা দেখে মনে হবে কেস। আপনার জেভিএম এর সাথে চালু করুন –illegal-access=permit...
ptomli

1
ওয়েল এটি মডিউল পথে যাওয়ার সিদ্ধান্ত নেওয়ার সময় কিছু জিনিস নিয়ে কাজ করার চেষ্টা করার বিষয়গুলিকে আরও আকর্ষণীয় করে তুলবে। সামনে সুপার মজার বার।
ত্যাশাল্লাকা

1
বিভিন্ন মানের জন্যfun
ptomli

আমি অন্য উত্তরটি গ্রহণ করেছি কারণ এটি আরও ব্যাখ্যা সরবরাহ করেছিল এবং প্রশ্নের উত্তর ছিল তবে দুঃখের সাথে আমি দুটি উত্তর গ্রহণ করতে পারি না।
চ্যাচল্লাকা

13

ক্ষেত্র এবং পদ্ধতিগুলি setAccessible()অ্যাক্সেস করতে ব্যবহৃত পদ্ধতিটি কেবল দেখুন private:

https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AccessibleObject.html#setAccessible-boolean-

https://docs.oracle.com/javase/9/docs/api/java/lang/reflect/AccessibleObject.html#setAccessible-boolean-

এই পদ্ধতিটি কাজ করার জন্য এখন আরও অনেক শর্ত প্রয়োজন। এটি প্রায় পুরানো সফ্টওয়্যারগুলির প্রায়শই ভেঙে না যাওয়ার একমাত্র কারণ হ'ল প্লেইন জেআরগুলি থেকে স্বয়ংক্রিয়ভাবে জড়িত মডিউলগুলি খুব অনুমোদিত (সকলের জন্য উন্মুক্ত এবং রফতানি করুন)।


1

আপনি যদি অ্যাড-ওপেন বিকল্পের সাথে যেতে চান, কোন মডিউলটি কোন প্যাকেজ -> সরবরাহ করে তা সন্ধানের জন্য এখানে একটি আদেশ রয়েছে

java --list-modules | tr @ " " | awk '{ print $1 }' | xargs -n1 java -d

মডিউলের নামটি @ এর সাথে প্রদর্শিত হবে যখন এটি ছাড়া প্যাকেজের নাম

দ্রষ্টব্য: জেডিকে ১১-এর সাথে পরীক্ষিত

গুরুত্বপূর্ণ: প্যাকেজ সরবরাহকারী অবৈধ অ্যাক্সেস না করে তার চেয়ে স্পষ্টতই ভাল

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.