MethodHandles.Lookup ব্যবহার করে Methods Access করা

Method Handles এবং Java 7+ - জাভা রিফ্লেক্ট প্যাকেজ (Java.reflect Package) - Java Technologies

308

Java 9 থেকে MethodHandles.Lookup একটি নতুন ফিচার হিসেবে পরিচিত হয়েছে, যা MethodHandle API এর অংশ এবং Java Reflection API এর উন্নত সংস্করণ হিসেবে কাজ করে। MethodHandles.Lookup আপনাকে methods, constructors, fields এবং arrays ইত্যাদির access দেয় এবং এটি Method.invoke() এর চেয়ে বেশি পারফরম্যান্সের সুবিধা প্রদান করে।

MethodHandles.Lookup এর ধারণা

MethodHandles.Lookup একটি ক্লাস যা method handles তৈরি করতে সাহায্য করে। এটি Reflection এর চেয়ে দ্রুত এবং নিরাপদ পদ্ধতিতে মেথড অ্যাক্সেস করতে সহায়ক। MethodHandle একটি মেথডের রেফারেন্স যা আপনাকে সেই মেথড কল করতে সাহায্য করে।

MethodHandles.Lookup এবং MethodHandle এর সুবিধা:

  • পারফরম্যান্স: MethodHandles বেশি পারফরম্যান্স প্রদান করে কারণ এটি Reflection এর মতো টাইপ চেকিং এবং প্রাইভেট মেম্বার অ্যাক্সেসের সীমাবদ্ধতা এড়িয়ে চলে।
  • নিরাপত্তা: Lookup একটি নিরাপদ উপায়, কারণ এটি শুধুমাত্র অনুমোদিত অ্যাক্সেস প্রদান করে।

কিভাবে MethodHandles.Lookup ব্যবহার করা হয়?

MethodHandles.Lookup ব্যবহার করে আপনি একটি ক্লাসের মেথড অ্যাক্সেস করতে পারেন। এখানে আমরা দেখব কিভাবে মেথড রিফ্লেকশন এবং MethodHandles.Lookup ব্যবহার করে এক্সেস করা যায়।

প্রথমে MethodHandles.Lookup ব্যবহার করার জন্য প্রস্তুতি:

import java.lang.invoke.*;
import java.lang.reflect.Method;

class Example {
    public void greet(String name) {
        System.out.println("Hello, " + name);
    }

    public int sum(int a, int b) {
        return a + b;
    }
}

public class MethodHandleExample {
    public static void main(String[] args) throws Throwable {
        // Step 1: Get the Lookup object for Example class
        MethodHandles.Lookup lookup = MethodHandles.lookup();

        // Step 2: Access the 'greet' method using MethodHandles.Lookup
        MethodHandle greetMethodHandle = lookup.findVirtual(Example.class, "greet", MethodType.methodType(void.class, String.class));

        // Step 3: Access the 'sum' method using MethodHandles.Lookup
        MethodHandle sumMethodHandle = lookup.findVirtual(Example.class, "sum", MethodType.methodType(int.class, int.class, int.class));

        // Step 4: Create an instance of the Example class
        Example example = new Example();

        // Step 5: Invoke the 'greet' method using MethodHandle
        greetMethodHandle.invoke(example, "Alice");

        // Step 6: Invoke the 'sum' method using MethodHandle
        int result = (int) sumMethodHandle.invoke(example, 10, 20);
        System.out.println("Sum Result: " + result);
    }
}

কোড ব্যাখ্যা:

  1. MethodHandles.lookup():
    • এটি একটি Lookup অবজেক্ট প্রদান করে যা রিফ্লেকশন এর মতো ক্লাসের মেথড বা ফিল্ড অ্যাক্সেস করতে সাহায্য করে।
  2. findVirtual():
    • findVirtual(Class<?> clazz, String name, MethodType methodType) মেথডটি একটি সাধারণ instance method এর MethodHandle ফেরত দেয়। এটি রানটাইমে একটি নির্দিষ্ট মেথডের পদ্ধতি খুঁজে বের করে এবং MethodHandle তৈরি করে।
    • MethodType.methodType(returnType, parameterTypes...) ব্যবহার করে মেথডের সঠিক টাইপ উল্লেখ করা হয়।
  3. MethodHandle.invoke():
    • MethodHandle.invoke(Object... args) মেথডটি MethodHandle ব্যবহার করে মেথড কল করে। এটি Reflection এর মতো কাজ করে কিন্তু অনেক দ্রুত।

আউটপুট:

Hello, Alice
Sum Result: 30

অতিরিক্ত বিবরণ:

  1. MethodHandle এর সুবিধা:
    • Performance: MethodHandles অধিক কার্যকরী কারণ এটি Method.invoke() এর তুলনায় দ্রুত কার্যকর হয়। কারণ এটি কম্পাইল টাইমে ঠিক করা হয় এবং runtime এ কম কাজ করে।
    • Flexibility: MethodHandles.Lookup এর মাধ্যমে আপনি ফিল্ড, মেথড এবং কনস্ট্রাক্টর অ্যাক্সেস করতে পারবেন।
    • Security: MethodHandles.Lookup যথাযথ নিরাপত্তা নিশ্চিত করে, যেমন একটি ক্লাসের প্রাইভেট মেথড বা ফিল্ড অ্যাক্সেস করা হলে নিরাপত্তার ক্ষেত্রে অনুমতি প্রাপ্ত হতে হবে।
  2. MethodHandles.lookup().findVirtual():
    • findVirtual() মেথডটি সঠিকভাবে ঐ ক্লাসের ইন্সট্যান্স মেথড অ্যাক্সেস করতে ব্যবহৃত হয়। যেমন greet এবং sum মেথডগুলো Example ক্লাসের ইন্সট্যান্স মেথড।
  3. MethodType.methodType():
    • এটি মেথডের টাইপ ডেফিনিশন সরবরাহ করে, যেমন আমরা MethodType.methodType(void.class, String.class) দিয়ে মেথডের টাইপ নির্ধারণ করেছি, যেখানে প্রথমে রিটার্ন টাইপ এবং তারপর প্যারামিটার টাইপগুলো দেওয়া হয়েছে।

MethodHandles.Lookup এর সঙ্গে Static Method Access:

যদি আপনি static method অ্যাক্সেস করতে চান তবে findStatic() মেথড ব্যবহার করতে হবে:

class Example {
    public static void staticMethod() {
        System.out.println("This is a static method.");
    }
}

public class MethodHandleStaticExample {
    public static void main(String[] args) throws Throwable {
        MethodHandles.Lookup lookup = MethodHandles.lookup();

        // Accessing static method using MethodHandles.Lookup
        MethodHandle staticMethodHandle = lookup.findStatic(Example.class, "staticMethod", MethodType.methodType(void.class));

        // Invoking the static method using MethodHandle
        staticMethodHandle.invoke();
    }
}

আউটপুট:

This is a static method.

MethodHandles.Lookup একটি শক্তিশালী টুল যা আপনাকে MethodHandle এর মাধ্যমে methods, constructors, এবং fields দ্রুত এবং নিরাপদভাবে অ্যাক্সেস করতে সাহায্য করে। এটি Reflection এর চেয়ে অধিক পারফরম্যান্স প্রদান করে এবং নিরাপত্তা নিশ্চিত করে। এর মাধ্যমে আপনি instance methods এবং static methods দ্রুত এবং কার্যকরভাবে রানটাইমে কল করতে পারবেন, যা Java Reflection এর তুলনায় আরও দ্রুত কার্যকরী।

Content added By
Promotion

Are you sure to start over?

Loading...