প্রতিবিম্ব ব্যবহার করে একটি স্থির পদ্ধতি চালু করা


198

আমি mainস্থিতিশীল পদ্ধতিতে প্রার্থনা করতে চাই । আমি টাইপের অবজেক্টটি পেয়েছি Class, তবে আমি সেই শ্রেণীর উদাহরণ তৈরি করতে সক্ষম নই এবং staticপদ্ধতিটি চালাতেও সক্ষম নই main

উত্তর:


289
// String.class here is the parameter type, that might not be the case with you
Method method = clazz.getMethod("methodName", String.class);
Object o = method.invoke(null, "whatever");

পদ্ধতিটি getDeclaredMethod()পরিবর্তে ব্যক্তিগত ব্যবহারের ক্ষেত্রে getMethod()। এবং setAccessible(true)পদ্ধতি অবজেক্ট কল ।


49

মেথড.নোভোকের জাভাদোক থেকে ():

যদি অন্তর্নিহিত পদ্ধতি স্থিতিশীল হয় তবে নির্দিষ্ট আপত্তি যুক্তি উপেক্ষা করা হবে। এটা নাল হতে পারে।

আপনি যখন কি ঘটবে

ক্লাস ক্লাস = ...;
পদ্ধতি এম = klass.getDeclaredMethod (পদ্ধতি নাম, প্যারামটাইপস);
m.invoke (নাল, আরোগুলি)

13
String methodName= "...";
String[] args = {};

Method[] methods = clazz.getMethods();
for (Method m : methods) {
    if (methodName.equals(m.getName())) {
        // for static methods we can use null as instance of class
        m.invoke(null, new Object[] {args});
        break;
    }
}

11
কেন সমস্ত পদ্ধতি ব্যবহার করে লুপিংয়ের পরিবর্তে সঠিক নাম দিয়ে getMethod ব্যবহার করবেন না?
mjaggard

11
কখনও কখনও getMethod ব্যবহার করার চেয়ে নাম অনুসারে পদ্ধতিটি লুপ করা এবং খুঁজে পাওয়া অনেক সহজ কারণ getMethod (বা getDeclaredMethod) এর জন্য আপনাকে প্যারামিটার ধরণের বিশদ বিবরণে কাজ করা দরকার। এটি কেবলমাত্র মাইক্রো দক্ষতার বিষয়টি নির্ভর করে - জাভা পুনরাবৃত্তি খুব দ্রুত তাই আপনি যদি কোনও অভ্যন্তরীণ লুপটিতে কয়েকবার পদ্ধতিটি কল না করেন তবে পুনরাবৃত্তির পরিমাণটি দ্রুত হবে
টনি ইস্টউড

2
এছাড়াও আরও বাস্তব জীবনের পরিস্থিতিতে আপনি সম্ভবত একবারে পদ্ধতিটি সন্ধান করতে পারবেন এমনকি আপনি যদি একাধিকবার অনুরোধ করার জন্য প্রতিচ্ছবি ব্যবহার করতে চলেছেন। এটি খুঁজে পাওয়ার সময় অতিরিক্ত ওভারহেড অপ্রয়োজনীয়।
রেনিপেট

4
যদিও ওভারলোডেড পদ্ধতিগুলির সাথে খারাপ সময় কাটাতে হবে।
ইউলিসি মিজরাহি

1
@ ইউলিসমিজ্রহী এটি সমস্ত কিছুর উপর নির্ভর করে তার উপর নির্ভর করে তবে হ্যাঁ আপনি যদি লাইব্রেরির কোড লিখছেন তবে কেবল নামের উপর নির্ভর করা বিপজ্জনক হতে পারে। আমি সাধারণত একটি নির্দিষ্ট টীকা বা একটি নির্দিষ্ট পদ্ধতির স্বাক্ষরের জন্য যাচাই করি, যেমন "স্ট্যাটিক পদ্ধতি যা স্ট্রিং নেয় এবং শ্রেণীর উদাহরণ দেয়", তারপরে দৃ as়ভাবে বলি যে এর মধ্যে কেবল একটি পদ্ধতি পাওয়া গেছে।
কোবজিলা

0
public class Add {
    static int add(int a, int b){
        return (a+b);
    }
}

উপরের উদাহরণে, 'অ্যাড' একটি স্থিতিশীল পদ্ধতি যা যুক্তি হিসাবে দুটি পূর্ণসংখ্যার গ্রহণ করে।

নিম্নলিখিত স্নিপেটটি ইনপুট 1 এবং 2 সহ 'অ্যাড' পদ্ধতিতে কল করতে ব্যবহৃত হয়।

Class myClass = Class.forName("Add");
Method method = myClass.getDeclaredMethod("add", int.class, int.class);
Object result = method.invoke(null, 1, 2);

রেফারেন্স লিঙ্ক

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.