java.lang.invoke প্যাকেজের ভূমিকা

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

330

java.lang.invoke প্যাকেজটি Java 7 তে পরিচিত হয়েছে এবং এটি Java Reflection API থেকে অনেক উন্নত, কার্যকর এবং দ্রুত পদ্ধতি প্রদান করে। এটি মূলত Java Virtual Machine (JVM)-এ ফাংশন কল এবং মেথড ইনভোকেশন পরিচালনার জন্য উন্নত ফিচার সরবরাহ করে।

java.lang.invoke প্যাকেজটি method invocation এবং method handles এর মাধ্যমে অনেক বেশি কার্যকরী ও উন্নত পদ্ধতিতে ফাংশন কল পরিচালনা করতে সহায়তা করে। এটি Reflection API এর তুলনায় বেশি পারফরম্যান্স কার্যকরী কারণ এটি কমপাইলারের সাথে ভালোভাবে ইন্টিগ্রেটেড এবং রানটাইমে অধিক কার্যকারিতা সরবরাহ করে।

মূল উপাদানসমূহ:

  1. MethodHandle:
    • MethodHandle ক্লাসটি মূলত একটি নির্দিষ্ট মেথড বা কনস্ট্রাক্টরের একটি শক্তিশালী রেফারেন্স। এটি একটি abstraction, যার মাধ্যমে আপনি একটি মেথড বা কনস্ট্রাক্টর রানটাইমে এক্সিকিউট করতে পারেন।
    • MethodHandle অনেক বেশি পারফরম্যান্স কন্ট্রোল এবং নির্ভুলতা প্রদান করে, যা Reflection API দিয়ে সরাসরি সম্ভব নয়।
  2. MethodHandles.Lookup:
    • MethodHandles.Lookup একটি ক্লাসের মেথড, কনস্ট্রাক্টর বা ফিল্ডের জন্য একটি রেফারেন্স তৈরি করার জন্য ব্যবহৃত হয়। এটি নিরাপত্তা কনট্রোলের মধ্যে রানটাইম মেথড এবং ফিল্ড এক্সেস করতে সহায়তা করে।
    • এটি MethodHandle তৈরি করতে সক্ষম হয় এবং কলব্যাক বা ইনভোকেশন পরিচালনা করতে ব্যবহৃত হয়।
  3. CallSite:
    • CallSite ক্লাসটি একটি গঠন যা একটি মেথড ইনভোকেশন রেজিস্টার করে এবং পরে তা কল করতে ব্যবহৃত হয়। এটি ডাইনামিক মেথড ডিসপ্যাচ ব্যবহার করার জন্য ব্যবহৃত হয়, যেখানে রানটাইমে মেথড রেজলভ করা হয়।
    • CallSite সাধারণত invokedynamic নির্দেশক দ্বারা কাজ করে, যা Java 7 তে আনা হয়েছে।

java.lang.invoke প্যাকেজের মূল সুবিধা:

  1. Dynamic Method Invocation:
    • এটি মেথড কল করার জন্য একটি খুবই শক্তিশালী ডাইনামিক পদ্ধতি প্রদান করে, যেখানে আপনি রানটাইমে কোন মেথড কল করবেন তা নির্ধারণ করতে পারেন। এটি invokedynamic কমান্ড ব্যবহার করে মেথড ডাইনামিকভাবে ইনভোক করার সুযোগ দেয়।
  2. Method Handle:
    • MethodHandle Reflection API এর তুলনায় অনেক বেশি পারফরম্যান্স কার্যকরী। এটি আপনি যখন মেথড কল করতে চান, তখন সরাসরি মেথডকে রেফারেন্স করার জন্য একটি হ্যান্ডেল প্রদান করে। এটি আরও কমপাইলারের সাথে ভালোভাবে কাজ করে এবং কম পারফরম্যান্স হিটের সৃষ্টি করে।
  3. Less Overhead:
    • Java Reflection API তুলনায় java.lang.invoke প্যাকেজের ব্যবহার কম পারফরম্যান্স ওভারহেড সৃষ্টি করে, কারণ এটি কমপাইলারের সাহায্যে অপটিমাইজ করা হয় এবং কম runtime ইনভোকেশন করে।
  4. Compatibility with invokedynamic:
    • java.lang.invoke প্যাকেজটি invokedynamic কমান্ডের সাথে পুরোপুরি সামঞ্জস্যপূর্ণ, যা গতিশীলভাবে মেথড ডিসপ্যাচ করতে এবং মেথডগুলোকে রানটাইমে নির্বাচন করতে সহায়তা করে। এটি বেশিরভাগ ফ্রেমওয়ার্কে ব্যবহৃত হয়, যেমন স্প্রিং (Spring), গুলি (Guice), এবং অন্যান্য dependency injection ফ্রেমওয়ার্কে।

MethodHandle উদাহরণ:

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;

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

public class MethodHandleExample {
    public static void main(String[] args) throws Throwable {
        // MethodHandles.Lookup object তৈরি করা
        MethodHandles.Lookup lookup = MethodHandles.lookup();

        // sayHello মেথডের জন্য MethodHandle তৈরি করা
        MethodHandle sayHelloHandle = lookup.findVirtual(Example.class, "sayHello", MethodType.methodType(void.class, String.class));

        // MethodHandle ব্যবহার করে মেথড ইনভোক করা
        Example example = new Example();
        sayHelloHandle.invoke(example, "Reflection");  // Output: Hello, Reflection
    }
}

ব্যাখ্যা:

  1. MethodHandles.lookup():
    • এটি MethodHandles.Lookup অবজেক্ট তৈরি করে, যার মাধ্যমে আমরা Example ক্লাসের মেথড sayHello খুঁজে পাই।
  2. MethodHandle:
    • lookup.findVirtual() মেথডের মাধ্যমে sayHello মেথডের জন্য MethodHandle তৈরি করা হয়েছে, যা Example.class ক্লাসের একটি ইনস্ট্যান্সের ওপর মেথড কল করার জন্য ব্যবহৃত হবে।
  3. Method Handle Invocation:
    • sayHelloHandle.invoke() মেথডটি ব্যবহার করে আমরা sayHello মেথডকে কল করেছি এবং "Reflection" আর্গুমেন্ট প্রদান করেছি। এর ফলস্বরূপ sayHello মেথডে "Hello, Reflection" প্রিন্ট হয়েছে।

CallSite এবং invokedynamic উদাহরণ:

import java.lang.invoke.*;

public class CallSiteExample {
    public static void main(String[] args) throws Throwable {
        // CallSite তৈরি
        MethodHandles.Lookup lookup = MethodHandles.lookup();
        MethodType methodType = MethodType.methodType(void.class);

        CallSite callSite = new ConstantCallSite(lookup.findStatic(CallSiteExample.class, "staticMethod", methodType));

        // CallSite এর মাধ্যমে মেথড কল
        callSite.getTarget().invokeExact();
    }

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

ব্যাখ্যা:

  1. CallSite:
    • এখানে CallSite তৈরি করা হয়েছে যা staticMethod নামক একটি মেথডের জন্য একটি ConstantCallSite হিসাবে কাজ করবে। এটি মেথড ইনভোকেশনকে ডাইনামিকভাবে প্রক্রিয়া করে।
  2. invokedynamic:
    • invokedynamic কমান্ডটি CallSite এবং MethodHandle এর মাধ্যমে ডাইনামিক মেথড ডিসপ্যাচ করতে ব্যবহৃত হয়। এটি রিফ্লেকশনের তুলনায় কম পারফরম্যান্স ওভারহেড সৃষ্টি করে এবং অধিক কার্যকরী হয়।

java.lang.invoke প্যাকেজটি Java এর ডাইনামিক মেথড ডিসপ্যাচ এবং ইনভোকেশন সিস্টেমকে শক্তিশালী করে তোলে। এটি Reflection API এর তুলনায় অনেক বেশি পারফরম্যান্স কার্যকরী এবং মেথড কলের জন্য কম runtime ইনভোকেশন প্রয়োজন হয়। MethodHandle এবং CallSite এর মাধ্যমে আপনি উন্নত ডাইনামিক মেথড ডিসপ্যাচ, ইনভোকেশন এবং ফাংশনাল প্রোগ্রামিং প্যাটার্ন বাস্তবায়ন করতে পারেন। invokedynamic কমান্ডের মাধ্যমে Java 7 এর পরবর্তী ভার্সনগুলিতে মেথড ইনভোকেশন আরও কার্যকরী এবং দ্রুত হয়েছে।

Content added By
Promotion

Are you sure to start over?

Loading...