জাভাতে আলাদা ক্লাস থেকে একটি প্রাইভেট ফিল্ডের মান কীভাবে পড়বেন?


481

আমার তৃতীয় পক্ষের মধ্যে খারাপভাবে নকশাকৃত ক্লাস রয়েছে এবং এর একটি ব্যক্তিগত ক্ষেত্রের JARআমার অ্যাক্সেস করা দরকার । উদাহরণস্বরূপ, আমার ব্যক্তিগত ক্ষেত্রটি কেন বেছে নেওয়া দরকার এটি প্রয়োজনীয়?

class IWasDesignedPoorly {
    private Hashtable stuffIWant;
}

IWasDesignedPoorly obj = ...;

এর মান পেতে আমি কীভাবে প্রতিবিম্ব ব্যবহার করতে পারি stuffIWant?

উত্তর:


665

ব্যক্তিগত ক্ষেত্রগুলিতে অ্যাক্সেস পাওয়ার জন্য আপনার এটিকে শ্রেণীর ঘোষিত ক্ষেত্রগুলি থেকে নেওয়া এবং তারপরে এগুলি অ্যাক্সেসযোগ্য করা দরকার:

Field f = obj.getClass().getDeclaredField("stuffIWant"); //NoSuchFieldException
f.setAccessible(true);
Hashtable iWantThis = (Hashtable) f.get(obj); //IllegalAccessException

সম্পাদনা করুন : যেমন অ্যাপারকিনস মন্তব্য করেছেন , উভয় ক্ষেত্রে ক্ষেত্র অ্যাক্সেস করা, এটিকে অ্যাক্সেসযোগ্য হিসাবে সেট করা এবং মানটি পুনরুদ্ধার করা ছুঁড়ে ফেলতে পারে Exception, যদিও কেবলমাত্র পরীক্ষিত আপনাকে সচেতন ব্যতিক্রমগুলি উপরে মন্তব্য করা হয়েছে।

NoSuchFieldExceptionআপনি একটি নাম যা ঘোষিত ক্ষেত্র মিলা করা হয়নি দ্বারা একটি ক্ষেত্র চাইলেন নিক্ষেপ করা হবে।

obj.getClass().getDeclaredField("misspelled"); //will throw NoSuchFieldException

IllegalAccessException, ফেলে দেওয়া হতো ক্ষেত্র প্রবেশযোগ্য ছিল না (উদাহরণস্বরূপ যদি এটা ব্যক্তিগত এবং হাতছাড়া মাধ্যমে অ্যাক্সেসযোগ্য তৈরি করা হয়েছেf.setAccessible(true) লাইন।

RuntimeExceptionগুলি যা নিক্ষিপ্ত হতে পারে পারেন হয় SecurityExceptionগুলি (যদি জেভিএম এর SecurityManagerআপনি যদি একটি ক্ষেত্রের অভিগম্যতা পরিবর্তন করার অনুমতি দেয় না), অথবা IllegalArgumentExceptionগুলি, যদি আপনি ক্ষেত্রের ক্লাস ধরনের কোনো বস্তুর উপর ক্ষেত্র চেষ্টা করুন এবং অ্যাক্সেস করুন:

f.get("BOB"); //will throw IllegalArgumentException, as String is of the wrong type

4
আপনি দয়া করে ব্যতিক্রম মন্তব্য ব্যাখ্যা করতে পারেন? কোড চলবে তবে ব্যতিক্রম ছুঁড়ে দেবে? বা কোড ব্যতিক্রম ছুঁড়ে দিতে পারে?
নীড় লেভি

1
@ নীর - না - সমস্ত সম্ভাবনায় কোডটি ঠিক ঠিক চলবে (ডিফল্ট সিকিউরিটি ম্যানেজার ক্ষেত্রগুলির অ্যাক্সেসিবিলিটি পরিবর্তন করার অনুমতি দেবে) - তবে আপনাকে চেক করা ব্যতিক্রমগুলি পরিচালনা করতে হবে (হয় সেগুলি ধরুন বা তাদের পুনরায় পুনর্বিবেচনার ঘোষণা দেবেন )। আমি আমার উত্তরটি কিছুটা পরিবর্তন করেছি। আপনার চারপাশে খেলতে এবং কী হয় তা দেখার জন্য একটি ছোট্ট পরীক্ষার কেস লিখে আপনার পক্ষে ভাল হতে পারে
অক্সবো_লাক

3
দুঃখিত, উত্তরটি আমার কাছে বিভ্রান্তিকর। সাধারণত ব্যতিক্রম হ্যান্ডলিংয়ের একটি উদাহরণ দেখান। ক্লাস একসাথে ভুলভাবে সংযুক্ত করা হলে ব্যতিক্রমগুলি ঘটবে বলে মনে হচ্ছে। কোড নমুনাটি দেখে মনে হচ্ছে ব্যতিক্রমগুলি একই llnes এ ছুঁড়ে দেওয়া হবে।
লাফায়েট

2
getDeclaredField()ক্ষেত্র খুঁজে না যদি তারা পিতা বা মাতা ক্লাসের সংজ্ঞায়িত করা হয় - আপনার কাছে বারবার আপ পিতা বা মাতা বর্গ অনুক্রমের মাধ্যমে কলিং আছে getDeclaredField()প্রতিটি পর্যন্ত আপনি একটি মিল খুঁজে (যা পরে আপনি কল করতে পারেন setAccessible(true)), অথবা আপনার কাছে পৌঁছাতে Object
লুক হাচিসন

1
@ দাবি করুন আপনি এই ধরনের অ্যাক্সেস নিষিদ্ধ করতে একটি সুরক্ষা পরিচালক ইনস্টল করতে পারেন। জাভা 9-এর পরে, এই জাতীয় অ্যাক্সেসটি মডিউল সীমানা জুড়ে কাজ করার কথা নয় (যদি না কোনও মডিউল স্পষ্টভাবে খোলা থাকে) তবে নতুন নিয়ম প্রয়োগের ক্ষেত্রে একটি ক্রান্তিকাল পর্যায় রয়েছে। তদ্ব্যতীত, প্রতিচ্ছবি যেমন অতিরিক্ত প্রচেষ্টা প্রয়োজন সর্বদা ক্ষেত্রবিহীন privateক্ষেত্রে একটি পার্থক্য তৈরি করে। এটি দুর্ঘটনাজনিত অ্যাক্সেসকে অন্তর্ভুক্ত করে।
25-30

159

FieldUtilsঅ্যাপাচি কমন্স-ল্যাং 3 থেকে চেষ্টা করুন :

FieldUtils.readField(object, fieldName, true);

76
আমি নিশ্চিত যে আপনি কমন্স-ল্যাং 3 থেকে কয়েকটি পদ্ধতি একত্রিত করে বিশ্বের বেশিরভাগ সমস্যার সমাধান করতে পারবেন।
ক্যামেরন

@ আইগোর জাভা কেন এটিকে অনুমতি দেয়? মানে জাভা কেন ব্যক্তিগত সদস্যদের অ্যাক্সেস করতে দেয়?
আসিফ মোশতাক

1
@ yegor256 আমি এখনও সি # এবং সি ++ প্রাইভেট সদস্যগুলিতেও অ্যাক্সেস করতে পারি .. !! তারপর? সব ভাষার স্রষ্টা কি দুর্বল?
আসিফ মোশতাক

3
@ অজানা জাভা নেই। দুটি আলাদা জিনিস রয়েছে - জাভা ভার্চুয়াল মেশিন হিসাবে জাভা ভাষা এবং জাভা। পরেরটি বাইকোডে পরিচালনা করে। এবং তা কাজে লাগানোর জন্য গ্রন্থাগার রয়েছে। সুতরাং জাভা ভাষা আপনাকে সুযোগের বাইরে ব্যক্তিগত ক্ষেত্রগুলি ব্যবহার করার অনুমতি দেয় না বা চূড়ান্ত রেফারেন্সকে রূপান্তর করতে দেয় না। তবে সরঞ্জামটি ব্যবহার করে এটি করা সম্ভব। যা কেবল স্ট্যান্ডার্ড লাইব্রেরির ভিতরেই ঘটে।
evgenii

3
@ অজানা কারণগুলির মধ্যে একটি হ'ল জাভাতে কেবলমাত্র ডিআই, ওআরএম বা এক্সএমএল / জেএসএন সিরিয়ালাইজারের মতো একটি অবকাঠামো কাঠামোর সাহায্যে ক্ষেত্রটিতে অ্যাক্সেস সক্ষম করতে "বন্ধু" অ্যাক্সেস নেই। এই জাতীয় ফ্রেমওয়ার্কগুলি কোনও বস্তুর অভ্যন্তরীণ অবস্থাটি সঠিকভাবে ক্রমিক বা আরম্ভ করতে অবজেক্ট ক্ষেত্রগুলিতে অ্যাক্সেসের প্রয়োজন, তবে আপনার ব্যবসায়িক যুক্তির জন্য আপনার এখনও সঠিক সংকলন-সময়ের এনক্যাপসুলেশন প্রয়োগের প্রয়োজন হতে পারে।
ইভান গ্যামেল

26

প্রতিবিম্ব আপনার সমস্যা সমাধানের একমাত্র উপায় নয় (যা কোনও শ্রেণীর / উপাদানগুলির ব্যক্তিগত কার্যকারিতা / আচরণ অ্যাক্সেস করা)

বিকল্প সমাধান হ'ল জাজার থেকে ক্লাসটি বের করা, জোড বা জাদ ব্যবহার করে এটি ডিসম্পাইল করুন , ক্ষেত্রটি পরিবর্তন করুন (বা একটি এক্সেসর যুক্ত করুন), এবং এটি আসল জাজারের বিরুদ্ধে পুনরায় সংকলন করুন। তারপরে ক্লাসপথে নতুন। ক্লাসটি পূর্বে রাখুন .jarবা এটিকে পুনরায় সন্নিবেশ করান .jar। (জার ইউটিলিটি আপনাকে একটি বিদ্যমান জজারে নিষ্কাশন করতে এবং পুনরায় প্রবেশের অনুমতি দেয়)

নীচে উল্লিখিত হিসাবে, এটি কেবলমাত্র কোনও ক্ষেত্র অ্যাক্সেস / পরিবর্তন করার পরিবর্তে ব্যক্তিগত রাষ্ট্রের অ্যাক্সেস / পরিবর্তন করার বিস্তৃত সমস্যাটি সমাধান করে।

.jarঅবশ্যই এটি স্বাক্ষরিত না হওয়া দরকার ।


36
এই উপায়টি কেবল একটি সহজ ক্ষেত্রের জন্য বেশ বেদনাদায়ক হবে।
ভ্যালেন্টিন রচার

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

4
তারপরে আপনাকে আবার এটি করতে হবে। জারটি যদি একটি আপডেট হয়ে যায় এবং আপনি যে ক্ষেত্রটির আর অস্তিত্ব নেই তার জন্য আপনি প্রতিবিম্বটি ব্যবহার করেন তবে কি হবে? এটা ঠিক একই সমস্যা। আপনাকে কেবল এটি পরিচালনা করতে হবে।
ব্রায়ান অগ্নিউ

4
এটিকে কতটা হ্রাস করা যায় তা নিয়ে আমি অবাক হয়েছি) এটিকে বাস্তব বিকল্প হিসাবে হাইলাইট করা হয়েছে খ) ক্ষেত্রের দৃশ্যমানতা পরিবর্তন করা যথেষ্ট নয় এমন দৃশ্যের জন্য এটি পরিবেশন করে
ব্রায়ান অগ্নিউ

2
@ ব্রায়ান অ্যাগনেইউ সম্ভবত এটি কেবল শব্দার্থক তবে আমরা যদি এই প্রশ্নের সাথে লেগে থাকি (একটি ব্যক্তিগত ক্ষেত্রটি পড়ার প্রতিচ্ছবি ব্যবহার করে) প্রতিবিম্বটি ব্যবহার না করা এখনই নিজের স্ববিরোধিতা is তবে আমি সম্মত হয়েছি আপনি ক্ষেত্রটিতে অ্যাক্সেস সরবরাহ করেছেন ... তবে ক্ষেত্রটি আর ব্যক্তিগত নয় তাই আবার আমরা প্রশ্নের "একটি ব্যক্তিগত ক্ষেত্র পড়ুন" তে আঁকড়ে থাকি না। অন্য একটি কোণ থেকে, জার পরিবর্তনটি কিছু ক্ষেত্রে (স্বাক্ষরিত জার) কাজ করতে পারে না, জারটি আপডেট হওয়ার সাথে সাথে প্রতিটি বার করার প্রয়োজন হয়, ক্লাসপাথের সাবধানতার সাথে হেরফেরের প্রয়োজন হয় (আপনি যদি কোনও ক্ষেত্রে কার্যকর হন তবে আপনি পুরোপুরি নিয়ন্ত্রণ করতে পারবেন না) অ্যাপ্লিকেশন ধারক) ইত্যাদি
রেমি মরিন

18

অন্য একটি বিকল্প যা এখনও উল্লেখ করা হয়নি: গ্রোভি ব্যবহার করুন । গ্রোভি আপনাকে ভাষার নকশার পার্শ্ব প্রতিক্রিয়া হিসাবে প্রাইভেট ইনস্ট্যান্স ভেরিয়েবল অ্যাক্সেস করার অনুমতি দেয়। আপনার মাঠের জন্য কোনও গেটর আছে বা না, আপনি কেবল ব্যবহার করতে পারেন

def obj = new IWasDesignedPoorly()
def hashTable = obj.getStuffIWant()

4
ওপি বিশেষত জাভা
জোচেন

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

10

জাভাতে প্রতিবিম্ব ব্যবহার করে আপনি private/publicএক শ্রেণীর সমস্ত ক্ষেত্র এবং পদ্ধতি অন্য শ্রেণিতে অ্যাক্সেস করতে পারেন ut তবে ওরাকল ডকুমেন্টেশন অনুসারে বিভাগে অপূর্ণতা তারা যে সুপারিশ করেছে:

"যেহেতু প্রতিবিম্ব কোডটি এমন অপারেশনগুলি সম্পাদন করতে দেয় যা অ-প্রতিবিম্বিত কোডগুলিতে অবৈধ হবে যেমন ব্যক্তিগত ক্ষেত্র এবং পদ্ধতিগুলি অ্যাক্সেসের ফলে প্রতিবিম্বের ব্যবহারের ফলে অপ্রত্যাশিত পার্শ্ব-প্রতিক্রিয়া দেখা দিতে পারে যা কোডকে অকার্যকর হতে পারে এবং বহনযোগ্যতার ক্ষতি করতে পারে। প্রতিবিম্বিত কোড বিমূর্ততা ভঙ্গ করে এবং তাই প্ল্যাটফর্মের আপগ্রেডের সাথে আচরণ পরিবর্তন করতে পারে "

এর মৌলিক ধারণাগুলি প্রদর্শনের জন্য এখানে কোড স্নাপগুলি অনুসরণ করা হচ্ছে প্রতিবিম্বের

Reflection1.java

public class Reflection1{

    private int i = 10;

    public void methoda()
    {

        System.out.println("method1");
    }
    public void methodb()
    {

        System.out.println("method2");
    }
    public void methodc()
    {

        System.out.println("method3");
    }

}

Reflection2.java

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class Reflection2{

    public static void main(String ar[]) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
    {
        Method[] mthd = Reflection1.class.getMethods(); // for axis the methods 

        Field[] fld = Reflection1.class.getDeclaredFields();  // for axis the fields  

        // Loop for get all the methods in class
        for(Method mthd1:mthd)
        {

            System.out.println("method :"+mthd1.getName());
            System.out.println("parametes :"+mthd1.getReturnType());
        }

        // Loop for get all the Field in class
        for(Field fld1:fld)
        {
            fld1.setAccessible(true);
            System.out.println("field :"+fld1.getName());
            System.out.println("type :"+fld1.getType());
            System.out.println("value :"+fld1.getInt(new Reflaction1()));
        }
    }

}

আশা করি এটি সাহায্য করবে।


5

অক্সবো_লেকস যেমন উল্লেখ করেছেন, আপনি অ্যাক্সেস বিধিনিষেধের আশেপাশের প্রতিচ্ছবিটি ব্যবহার করতে পারেন (ধরে নিলে আপনার সিকিউরিটি ম্যানেজার আপনাকে দেয়)।

এটি বলেছিল, যদি এই শ্রেণিটি এত খারাপভাবে ডিজাইন করা থাকে যে এটি আপনাকে এই জাতীয় হ্যাকারিটির আশ্রয় দেয়, সম্ভবত আপনার বিকল্পের সন্ধান করা উচিত। নিশ্চয়ই এই ছোট্ট হ্যাকটি আপনাকে এখন কয়েক ঘন্টা বাঁচাতে পারে, তবে রাস্তায় আপনাকে কতটা ব্যয় করতে হবে?


3
আমি তার চেয়ে ভাগ্যবান, আমি এই কোডটি কিছু ডেটা আহরণের জন্য ব্যবহার করছি, তারপরে আমি এটিকে আবার রিসাইকেল বিনে টস করতে পারি।
ফ্রাঙ্ক ক্রুয়েজার

2
ঠিক আছে, হ্যাক দূরে। :-)
লরেন্স গনসাল্ভেস

3
এটি প্রশ্নের উত্তর সরবরাহ করে না। কোনও লেখকের কাছ থেকে সমালোচনা বা স্পষ্টতার জন্য অনুরোধ জানাতে, তাদের পোস্টের নীচে একটি মন্তব্য দিন।
মুরিনিক

@ মুউরিনিক - "আপনি প্রতিবিম্ব ব্যবহার করতে পারেন" এই শব্দটি দিয়ে এটি প্রশ্নের উত্তর দেয়। এটির উদাহরণ বা আরও বৃহত্তর ব্যাখ্যা বা কীভাবে নেই, তবে এটি একটি উত্তর। আপনি যদি এটি পছন্দ না করেন তবে এটি ডাউনভোট করুন।
আর্টঅফ ওয়ারফেয়ার

4

সরাসরি বাইকোডটি সংশোধন করতে সোট জাভা অপ্টিমাইজেশনের কাঠামোটি ব্যবহার করুন। http://www.sable.mcgill.ca/soot/

সট পুরোপুরি জাভাতে লেখা এবং জাভা নতুন সংস্করণে কাজ করে।


3

আপনাকে নিম্নলিখিতগুলি করতে হবে:

private static Field getField(Class<?> cls, String fieldName) {
    for (Class<?> c = cls; c != null; c = c.getSuperclass()) {
        try {
            final Field field = c.getDeclaredField(fieldName);
            field.setAccessible(true);
            return field;
        } catch (final NoSuchFieldException e) {
            // Try parent
        } catch (Exception e) {
            throw new IllegalArgumentException(
                    "Cannot access field " + cls.getName() + "." + fieldName, e);
        }
    }
    throw new IllegalArgumentException(
            "Cannot find field " + cls.getName() + "." + fieldName);
}

2

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

পোস্ট করা উদাহরণটি সম্বোধন করতে:

Hashtable iWantThis = (Hashtable)ReflectionTestUtils.getField(obj, "stuffIWant");

1
যদি আপনি স্প্রিংয়ের মাধ্যমে ইউটিস ক্লাস ব্যবহার করার সিদ্ধান্ত নেন, তবে আপনার সত্যিকার অর্থে টেস্টহীন একটি ( ডকস.স্প্রিং.ইও / স্প্রিং- ফ্রেমওয়ার্ক / ডকস / কর্নার / জাভাদোক- এপি / অর্গ / ৮ ) ব্যবহার করা উচিত যদি না অবশ্যই আসলে এটি ইউনিট পরীক্ষার জন্য ব্যবহার করছে।
সিঙ্ক করুন

সম্ভবত, যদিও সেই শ্রেণিটি "কেবলমাত্র অভ্যন্তরীণ ব্যবহারের উদ্দেশ্যে" হিসাবে বর্ণনা করা হয়েছে। আমি এই সম্পর্কে উত্তরে কিছু তথ্য যুক্ত করেছি। ( ReflectionTestUtilsআমার অভিজ্ঞতা হিসাবে উদাহরণটি ব্যবহার করে রেখেছি আমার পরীক্ষার পরিস্থিতিতে এই ধরণের কাজ করার দরকার ছিল কেবল আমার।)
স্টিভ চেম্বারস

1

প্রতিবিম্ব সম্পর্কে কেবল একটি অতিরিক্ত নোট: আমি কয়েকটি বিশেষ ক্ষেত্রে লক্ষ্য করেছি, যখন একই প্যাকেজের সাথে একই নামের বেশ কয়েকটি ক্লাস উপস্থিত থাকে, উপরের উত্তরে ব্যবহৃত প্রতিবিম্বটি বস্তু থেকে সঠিক শ্রেণি বাছাই করতে ব্যর্থ হতে পারে। সুতরাং যদি আপনি জানেন যে অবজেক্টের প্যাকেজ.ক্লাসটি কী, তবে তার ব্যক্তিগত ক্ষেত্রের মানগুলি নিম্নরূপে অ্যাক্সেস করা ভাল:

org.deeplearning4j.nn.layers.BaseOutputLayer ll = (org.deeplearning4j.nn.layers.BaseOutputLayer) model.getLayer(0);
Field f = Class.forName("org.deeplearning4j.nn.layers.BaseOutputLayer").getDeclaredField("solver");
f.setAccessible(true);
Solver s = (Solver) f.get(ll);

(এটি উদাহরণ ক্লাস যা আমার পক্ষে কাজ করে না)


1

আপনি সরাসরি, টাইপ-নিরাপদ জাভা প্রতিবিম্বের জন্য ম্যানিফোল্ডের @ জেলবারিক ব্যবহার করতে পারেন :

@JailBreak Foo foo = new Foo();
foo.stuffIWant = "123;

public class Foo {
    private String stuffIWant;
}

@JailBreakfooসমস্ত সদস্যের সরাসরি অ্যাক্সেসের জন্য সংকলকটিতে স্থানীয় চলকটি আনলক করেFooএর শ্রেণিবিন্যাসের ।

একইভাবে আপনি জেল ব্রেক () এক্সটেনশন পদ্ধতিটি এক-বন্ধ ব্যবহারের জন্য ব্যবহার করতে পারেন:

foo.jailbreak().stuffIWant = "123";

jailbreak()পদ্ধতির মাধ্যমে আপনি যে কোনও সদস্যকে অ্যাক্সেস করতে পারবেনFoo শ্রেণিবিন্যাসের ।

উভয় ক্ষেত্রেই সংকলকটি আপনার জন্য ফিল্ড অ্যাক্সেসটি নিরাপদে টাইপ করে সুরক্ষিত করে, যেন কোনও পাবলিক ফিল্ড, ম্যানিফোल्ड হুডের নিচে আপনার জন্য দক্ষ প্রতিচ্ছবি কোড তৈরি করে।

ম্যানিফোल्ड সম্পর্কে আরও আবিষ্কার করুন ।


1

এক্স্রেইন্টারফেস সরঞ্জামটি দিয়ে এটি বেশ সহজ । কেবল অনুপস্থিত getters / setters সংজ্ঞায়িত করুন, যেমন

interface BetterDesigned {
  Hashtable getStuffIWant(); //is mapped by convention to stuffIWant
}

এবং আপনার খারাপ নকশা করা প্রকল্পটি xray করুন:

IWasDesignedPoorly obj = new IWasDesignedPoorly();
BetterDesigned better = ...;
System.out.println(better.getStuffIWant());

অভ্যন্তরীণভাবে এটি প্রতিবিম্বের উপর নির্ভর করে।


0

সমস্যার জন্য সমস্যাটি ঘুরে দেখার চেষ্টা করুন, আপনি যে ক্যালাসটি ডেটা সেট করতে / পেতে চান তা আপনার নিজের ক্লাসের একটি।

শুধু একটি public setter(Field f, Object value)এবং তার public Object getter(Field f)জন্য তৈরি করুন । এমনকি এগুলির সদস্য ফাংশনের ভিতরে আপনি নিজেরাই কিছু সিকিওরোটি চেক করতে পারেন। সেটার জন্য যেমন:

class myClassName {
    private String aString;

    public set(Field field, Object value) {
        // (A) do some checkings here  for security

        // (B) set the value
        field.set(this, value);
    }
}

অবশ্যই, এখন আপনি জানতে আছে java.lang.reflect.Fieldজন্যsString ক্ষেত্র মান নির্ধারণের পূর্বে।

আমি এই কৌশলটি জেনেরিক রেজাল্টসেট-থেকে-এবং-থেকে-মডেল-ম্যাপারে ব্যবহার করি।

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