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);
}
}
কোড ব্যাখ্যা:
MethodHandles.lookup():- এটি একটি
Lookupঅবজেক্ট প্রদান করে যা রিফ্লেকশন এর মতো ক্লাসের মেথড বা ফিল্ড অ্যাক্সেস করতে সাহায্য করে।
- এটি একটি
findVirtual():findVirtual(Class<?> clazz, String name, MethodType methodType)মেথডটি একটি সাধারণ instance method এরMethodHandleফেরত দেয়। এটি রানটাইমে একটি নির্দিষ্ট মেথডের পদ্ধতি খুঁজে বের করে এবংMethodHandleতৈরি করে।MethodType.methodType(returnType, parameterTypes...)ব্যবহার করে মেথডের সঠিক টাইপ উল্লেখ করা হয়।
MethodHandle.invoke():MethodHandle.invoke(Object... args)মেথডটিMethodHandleব্যবহার করে মেথড কল করে। এটি Reflection এর মতো কাজ করে কিন্তু অনেক দ্রুত।
আউটপুট:
Hello, Alice
Sum Result: 30
অতিরিক্ত বিবরণ:
MethodHandleএর সুবিধা:- Performance:
MethodHandlesঅধিক কার্যকরী কারণ এটিMethod.invoke()এর তুলনায় দ্রুত কার্যকর হয়। কারণ এটি কম্পাইল টাইমে ঠিক করা হয় এবং runtime এ কম কাজ করে। - Flexibility:
MethodHandles.Lookupএর মাধ্যমে আপনি ফিল্ড, মেথড এবং কনস্ট্রাক্টর অ্যাক্সেস করতে পারবেন। - Security:
MethodHandles.Lookupযথাযথ নিরাপত্তা নিশ্চিত করে, যেমন একটি ক্লাসের প্রাইভেট মেথড বা ফিল্ড অ্যাক্সেস করা হলে নিরাপত্তার ক্ষেত্রে অনুমতি প্রাপ্ত হতে হবে।
- Performance:
MethodHandles.lookup().findVirtual():findVirtual()মেথডটি সঠিকভাবে ঐ ক্লাসের ইন্সট্যান্স মেথড অ্যাক্সেস করতে ব্যবহৃত হয়। যেমনgreetএবংsumমেথডগুলোExampleক্লাসের ইন্সট্যান্স মেথড।
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 এর তুলনায় আরও দ্রুত কার্যকরী।
Read more