JAVA REFLECTION

JAVA REFLECTION საშუალებას გვაძლევს “დავათვალიეროთ” კლასები, ინტერფეისები, ველები და ემთოდები runtime-ს დროს  და მათის სახელების არცოდნის შემთხვევაში კომპილაციის დროს. REFLECTION -ის მეშვეობით ასევე შესაძლებელია ახალი ობიექტის შექმნა, მეთოდის გამოძახება და ველების “წამოღება” და “შეცვლა” (get/set) . მოდით უშუალოდ მაგალითზე განვიხილოთ REFLECTION -ის რამდენიმე შესაძლებლობა. ვთქვათ გვაქვს შემდეგი კლასი Reflection.Java

methods and fields

ეს კლასი იმპლემენტაციას უკეთებს MyInterface1 და MyInterface2 ინტერფეისებს. აქვს სტრიქონული ტიპის ორი private წვდომის ველი privateString1 და privateString2. აქვს პარამეტრიანი კონსტრუქტორი, რომელსაც გადაეცემა ორი სტრიქონული ტიპის პარამეტრები და გადაცემულ პარამეტრებს ანიჭებს თავისივე ველებს. აქვს ორი მეთოდი. myMethod1(), რომელიც private წვდომისაა და myMethod1(), რომელიც public წვდომისაა.  განვიხილოთ რამდენიმე მაგალითი.

get public methodsmain მეთოდში ჩვენ ვქმნით Reflection კლასის ორ ობიექტს. უფრო სწორად ერთს ვქმნით Reflection ტიპისას ხოლო მეორეს Class ტიპისას. ვქმნით Method ტიპის მასივს და მას getMethods() მეთოდის მეშვეობით ვანიჭებთ Reflection კლასის ყველა public წვდომის მეთოდს. შემდეგ უბრალოდ სატესტოდ foreach ციკლით დავივლით მეთოდების მასივს და ვაბრუნებთ ყველა იმ მეთოდს, რომელსაც შეიცავს Reflection  კლასი. ყურადღება მისაქცევია ისიც, რომ გარდა იმ ორი მეთოდისა, რაც ამ კლასშია, მისი მეთოდია java.lang.Object კლასიდან მემკვიდრეობით გადმოსული მეთოდები.

ახლა განვიხილოთ ობიექტის შექმნა კონსტრუქტორის მეშვეობით. სანამ მაგალითის განხილვაზე გადავიდოდეთ გეტყვით, რომ ეს ძალიან კარგი ტექნიკაა, რადგან პროგრამისტს შეუძლია მხოლოდ კლასის სახელის ცოდნით შექმნას ობიექტი.

Create Object using taken consturctor

 

ვქმნით Constructor ტიპის ობიექტ constructor-ს და ჩვენს მიერ Reflection კლასის ობიექტით (myClass) ვიძახებთ getConstructor(String.class) მეთოდს, რომელიც გვიბრუნებს კონსტრუქტორს, რომელსაც პარამეტრად სტრიქონული ტიპი გადაეცემა. ყურადღება მისაქცევია ისიც, რომ კოდის ეს ნაწილი უნდა ჩაისვას try – catch ბლოკში, რადგან შეიძება ასეთი კონსტრუქტორი არ არსებობდეს და მოხდეს შეცდომა.

შემდეგ ვქმნით Object ტიპის obj ობიექტს და აღებული კონსტრუქტორით ვიძახებთ newInstance(“I LOVE JAVA”) მეთოდს, რომელიც ქმნის ობიექტს, კონსტრუქტორით, რომელსაც პარამეტრად გადაეცემა სტრიქონული ტიპი. if პირობაში უბრალოდ ვამოწმებთ შეიქმნა თუ არა ობიექტი (ტესტირებისთვის).

ახლა განვიხილოთ private წვდომის მეთოდების გამოძახება. როგორც ვიცით, ჩვეულებრივ ეს შეუძლებელია, მაგრამ ჩვენ Reflection -ის მეშვეობით შეგვიძლია ჩვეულებრივი წესების დარღვევა.

invoke private method

 

ვმქნით Reflection კლასის ობიექტს და getDeclaredMethd(“myMethod1”,null); ის მეშვეობით ვიძახებთ მეთოდს ,რომლის სახელიცაა myMethod1 , ხოლო მეორე პარამეტრი null მიუთითებს იმაზე, რომ myMethod1  მეთოდს არ გადაეცემა პარამეტრები (უპარამეტროა). ჩევნ უკვე აღებული გვაქვს მეთოდი privateMethod და შემდეგ ვიძახებთ setAccessible მეთოდს privateMethod -თვის , რომელსაც პარამეტრად true-ს გადავცემთ. ამის შემდეგ უკვე გვაქვს myMethod1  -ზე წვდომა და invoke მეთოდისთ ვიძახებთ myMethod1 ()-ს. invoke მეთოდს გადაეცემა ობიექტი, რომელი ობიექტის მეთოდსაც ვიძახებთ და გამოძახებული მეთოდის პარამეტრები. რადგან myMethod1() -ს პარამეტრები არ  გადაეცემა ვწერთ null-ს.  ყურადღება მისაქცევია ისიც, რომ კოდის ეს ნაწილი უნდა ჩაისვას try – catch ბლოკში, რადგან შეიძება ასეთი მეთოდი არ არსებობდეს და მოხდეს შეცდომა.

ახლა განვიხილოთ private Field-ებზე წვდომა.

change field value and access private fields

 

მოცემული კოდის პირველი ნაწილი უბრალოდ იმის დემონსტრირებაა, თუ როგორ უნდა მივწვდეთ და სურვილის შემთხვევაში შევცვალოთ ობიექტის public field, ხოლო მეორე ნაწილი უკვე დემონსტრირებაა კლასის private field-ებზე წვდომის. ეს უკანასკნელი ანალოგიურია , წინა განხილული მაგალითისა მეთოდებზე და ვფიქრობ, თქვენთვის არ უნდა იყოს პრობლემა მასში გარკვევისა. თუ რაიმე კითხვა გაგიჩნდებათ, შეგიძლიათ კომენტარის სახით დატოვოთ და აუცილებლად გიპასუხებთ.

 

Leave a Reply / უპასუხე

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / შეცვლა )

Twitter picture

You are commenting using your Twitter account. Log Out / შეცვლა )

Facebook photo

You are commenting using your Facebook account. Log Out / შეცვლა )

Google+ photo

You are commenting using your Google+ account. Log Out / შეცვლა )

Connecting to %s