java.lang.invoke প্যাকেজটি Java 7 তে পরিচিত হয়েছে এবং এটি Java Reflection API থেকে অনেক উন্নত, কার্যকর এবং দ্রুত পদ্ধতি প্রদান করে। এটি মূলত Java Virtual Machine (JVM)-এ ফাংশন কল এবং মেথড ইনভোকেশন পরিচালনার জন্য উন্নত ফিচার সরবরাহ করে।
java.lang.invoke প্যাকেজটি method invocation এবং method handles এর মাধ্যমে অনেক বেশি কার্যকরী ও উন্নত পদ্ধতিতে ফাংশন কল পরিচালনা করতে সহায়তা করে। এটি Reflection API এর তুলনায় বেশি পারফরম্যান্স কার্যকরী কারণ এটি কমপাইলারের সাথে ভালোভাবে ইন্টিগ্রেটেড এবং রানটাইমে অধিক কার্যকারিতা সরবরাহ করে।
মূল উপাদানসমূহ:
- MethodHandle:
MethodHandleক্লাসটি মূলত একটি নির্দিষ্ট মেথড বা কনস্ট্রাক্টরের একটি শক্তিশালী রেফারেন্স। এটি একটি abstraction, যার মাধ্যমে আপনি একটি মেথড বা কনস্ট্রাক্টর রানটাইমে এক্সিকিউট করতে পারেন।MethodHandleঅনেক বেশি পারফরম্যান্স কন্ট্রোল এবং নির্ভুলতা প্রদান করে, যা Reflection API দিয়ে সরাসরি সম্ভব নয়।
- MethodHandles.Lookup:
MethodHandles.Lookupএকটি ক্লাসের মেথড, কনস্ট্রাক্টর বা ফিল্ডের জন্য একটি রেফারেন্স তৈরি করার জন্য ব্যবহৃত হয়। এটি নিরাপত্তা কনট্রোলের মধ্যে রানটাইম মেথড এবং ফিল্ড এক্সেস করতে সহায়তা করে।- এটি
MethodHandleতৈরি করতে সক্ষম হয় এবং কলব্যাক বা ইনভোকেশন পরিচালনা করতে ব্যবহৃত হয়।
- CallSite:
CallSiteক্লাসটি একটি গঠন যা একটি মেথড ইনভোকেশন রেজিস্টার করে এবং পরে তা কল করতে ব্যবহৃত হয়। এটি ডাইনামিক মেথড ডিসপ্যাচ ব্যবহার করার জন্য ব্যবহৃত হয়, যেখানে রানটাইমে মেথড রেজলভ করা হয়।CallSiteসাধারণত invokedynamic নির্দেশক দ্বারা কাজ করে, যা Java 7 তে আনা হয়েছে।
java.lang.invoke প্যাকেজের মূল সুবিধা:
- Dynamic Method Invocation:
- এটি মেথড কল করার জন্য একটি খুবই শক্তিশালী ডাইনামিক পদ্ধতি প্রদান করে, যেখানে আপনি রানটাইমে কোন মেথড কল করবেন তা নির্ধারণ করতে পারেন। এটি
invokedynamicকমান্ড ব্যবহার করে মেথড ডাইনামিকভাবে ইনভোক করার সুযোগ দেয়।
- এটি মেথড কল করার জন্য একটি খুবই শক্তিশালী ডাইনামিক পদ্ধতি প্রদান করে, যেখানে আপনি রানটাইমে কোন মেথড কল করবেন তা নির্ধারণ করতে পারেন। এটি
- Method Handle:
MethodHandleReflection API এর তুলনায় অনেক বেশি পারফরম্যান্স কার্যকরী। এটি আপনি যখন মেথড কল করতে চান, তখন সরাসরি মেথডকে রেফারেন্স করার জন্য একটি হ্যান্ডেল প্রদান করে। এটি আরও কমপাইলারের সাথে ভালোভাবে কাজ করে এবং কম পারফরম্যান্স হিটের সৃষ্টি করে।
- Less Overhead:
- Java Reflection API তুলনায়
java.lang.invokeপ্যাকেজের ব্যবহার কম পারফরম্যান্স ওভারহেড সৃষ্টি করে, কারণ এটি কমপাইলারের সাহায্যে অপটিমাইজ করা হয় এবং কম runtime ইনভোকেশন করে।
- Java Reflection API তুলনায়
- 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
}
}
ব্যাখ্যা:
- MethodHandles.lookup():
- এটি
MethodHandles.Lookupঅবজেক্ট তৈরি করে, যার মাধ্যমে আমরাExampleক্লাসের মেথডsayHelloখুঁজে পাই।
- এটি
- MethodHandle:
lookup.findVirtual()মেথডের মাধ্যমেsayHelloমেথডের জন্যMethodHandleতৈরি করা হয়েছে, যাExample.classক্লাসের একটি ইনস্ট্যান্সের ওপর মেথড কল করার জন্য ব্যবহৃত হবে।
- 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.");
}
}
ব্যাখ্যা:
- CallSite:
- এখানে
CallSiteতৈরি করা হয়েছে যাstaticMethodনামক একটি মেথডের জন্য একটি ConstantCallSite হিসাবে কাজ করবে। এটি মেথড ইনভোকেশনকে ডাইনামিকভাবে প্রক্রিয়া করে।
- এখানে
- invokedynamic:
invokedynamicকমান্ডটিCallSiteএবংMethodHandleএর মাধ্যমে ডাইনামিক মেথড ডিসপ্যাচ করতে ব্যবহৃত হয়। এটি রিফ্লেকশনের তুলনায় কম পারফরম্যান্স ওভারহেড সৃষ্টি করে এবং অধিক কার্যকরী হয়।
java.lang.invoke প্যাকেজটি Java এর ডাইনামিক মেথড ডিসপ্যাচ এবং ইনভোকেশন সিস্টেমকে শক্তিশালী করে তোলে। এটি Reflection API এর তুলনায় অনেক বেশি পারফরম্যান্স কার্যকরী এবং মেথড কলের জন্য কম runtime ইনভোকেশন প্রয়োজন হয়। MethodHandle এবং CallSite এর মাধ্যমে আপনি উন্নত ডাইনামিক মেথড ডিসপ্যাচ, ইনভোকেশন এবং ফাংশনাল প্রোগ্রামিং প্যাটার্ন বাস্তবায়ন করতে পারেন। invokedynamic কমান্ডের মাধ্যমে Java 7 এর পরবর্তী ভার্সনগুলিতে মেথড ইনভোকেশন আরও কার্যকরী এবং দ্রুত হয়েছে।
Read more