আমি জাভাতে প্যারামিটার হিসাবে কোনও ক্লাস কীভাবে পাস করব?


136

জাভাতে প্যারামিটার হিসাবে ক্লাস পাস এবং সেই ক্লাস থেকে কিছু পদ্ধতি ফায়ার করার কোনও উপায় আছে কি?

void main()
{
    callClass(that.class)
}

void callClass(???? classObject)
{
    classObject.somefunction
    // or 
    new classObject()
    //something like that ?
}

আমি গুগল ওয়েব টুলকিট ব্যবহার করছি এবং এটি প্রতিবিম্ব সমর্থন করে না।

উত্তর:


129
public void foo(Class c){
        try {
            Object ob = c.newInstance();
        } catch (InstantiationException ex) {
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

প্রতিবিম্ব ব্যবহার করে কীভাবে পদ্ধতিতে প্রার্থনা করবেন

 import java.lang.reflect.*;


   public class method2 {
      public int add(int a, int b)
      {
         return a + b;
      }

      public static void main(String args[])
      {
         try {
           Class cls = Class.forName("method2");
           Class partypes[] = new Class[2];
            partypes[0] = Integer.TYPE;
            partypes[1] = Integer.TYPE;
            Method meth = cls.getMethod(
              "add", partypes);
            method2 methobj = new method2();
            Object arglist[] = new Object[2];
            arglist[0] = new Integer(37);
            arglist[1] = new Integer(47);
            Object retobj 
              = meth.invoke(methobj, arglist);
            Integer retval = (Integer)retobj;
            System.out.println(retval.intValue());
         }
         catch (Throwable e) {
            System.err.println(e);
         }
      }
   }

এছাড়াও দেখুন


এবং আমি কীভাবে ডিফল্ট কনস্ট্রাক্টর বা সেই শ্রেণীর কিছু পদ্ধতি ফায়ার করব?

দুঃখিত, আমি গুগল ওয়েব টুল কিট এবং স্টাফ সম্পর্কে যোগ করতে ভুলে গেছি, গুগল ওয়েব টুলকিট ব্যবহার করছি এবং এটি প্রতিচ্ছবি সমর্থন করে না।

1
তাকান এখানে এবং এখানে এছাড়াও এই
Jigar থেকে জোশী

আমি দর্শনের কথা বলতে চাই! ক্লাস জাভাতে কোনও ডেটা টাইপ হয়?
মিলাদ রহিমি

40
public void callingMethod(Class neededClass) {
    //Cast the class to the class you need
    //and call your method in the class
    ((ClassBeingCalled)neededClass).methodOfClass();
}

পদ্ধতিটি কল করতে, আপনি এটি কল করুন:

callingMethod(ClassBeingCalled.class);

প্রশ্নকর্তা ক্লাসের কনস্ট্রাক্টরও ব্যবহার করতে চেয়েছিলেন। এটি সহজ নয় এবং এখানে কেউ এটি সম্বোধন করছে না। এই পোস্টটি একটি বিকল্প সরবরাহ করে (সমস্ত মন্তব্য পড়ুন, কারণ গৃহীত উত্তরটি কাজ করে না): stackoverflow.com/questions/234600/… । এটি বেশ অগোছালো, এবং সংকলক সতর্কতাগুলি আপনাকে বোঝায় যে তারা জাভা দিয়ে লোকেরা এটি করুক না। পাইথনে অনেক সহজ:)
অ্যান্ড্রু পুগলিওনেসি

9

এটি গ্রহণ করার জন্য আপনার পদ্ধতিটি তৈরি করুন-

public <T> void printClassNameAndCreateList(Class<T> className){
    //example access 1
    System.out.print(className.getName());

    //example access 2
    ArrayList<T> list = new ArrayList<T>();
    //note that if you create a list this way, you will have to cast input
    list.add((T)nameOfObject);
}

পদ্ধতিটি কল করুন-

printClassNameAndCreateList(SomeClass.class);

আপনি ক্লাসের ধরণের সীমাবদ্ধও করতে পারেন, উদাহরণস্বরূপ, এটি আমার তৈরি একটি লাইব্রেরি থেকে প্রাপ্ত পদ্ধতিগুলির মধ্যে একটি-

protected Class postExceptionActivityIn;

protected <T extends PostExceptionActivity>  void  setPostExceptionActivityIn(Class <T> postExceptionActivityIn) {
    this.postExceptionActivityIn = postExceptionActivityIn;
}

আরও তথ্যের জন্য, প্রতিচ্ছবি এবং জেনারিক্স অনুসন্ধান করুন।


4

ব্যবহার

void callClass(Class classObject)
{
   //do something with class
}

একটি Classএকটি জাভা বস্তু, যাতে আপনি এর ধরন ব্যবহার করে এটি পড়ুন পারে।

অফিসিয়াল ডকুমেন্টেশন থেকে এটি সম্পর্কে আরও পড়ুন ।


2

এই জাতীয় জিনিস সহজ নয়। এখানে এমন একটি পদ্ধতি যা স্ট্যাটিক পদ্ধতিটিকে কল করে:

public static Object callStaticMethod(
    // class that contains the static method
    final Class<?> clazz,
    // method name
    final String methodName,
    // optional method parameters
    final Object... parameters) throws Exception{
    for(final Method method : clazz.getMethods()){
        if(method.getName().equals(methodName)){
            final Class<?>[] paramTypes = method.getParameterTypes();
            if(parameters.length != paramTypes.length){
                continue;
            }
            boolean compatible = true;
            for(int i = 0; i < paramTypes.length; i++){
                final Class<?> paramType = paramTypes[i];
                final Object param = parameters[i];
                if(param != null && !paramType.isInstance(param)){
                    compatible = false;
                    break;
                }

            }
            if(compatible){
                return method.invoke(/* static invocation */null,
                    parameters);
            }
        }
    }
    throw new NoSuchMethodException(methodName);
}

আপডেট: অপেক্ষা করুন, আমি কেবল প্রশ্নের উপর gwt ট্যাগটি দেখেছি। আপনি জিডব্লিউটি-তে প্রতিবিম্ব ব্যবহার করতে পারবেন না


1

আপনি কী অর্জন করতে চাইছেন তা আমি নিশ্চিত নই, তবে আপনি বিবেচনা করতে চাইতে পারেন যে ক্লাস পাস করা আপনার যা করার দরকার তা নাও হতে পারে। অনেক ক্ষেত্রে ক্লাসের সাথে ডিল করা সহজেই কোনও ধরণের কারখানার প্যাটার্নের মধ্যে আবদ্ধ হয় এবং এর ব্যবহার একটি ইন্টারফেসের মাধ্যমে করা হয়। এখানে সেই নিদর্শনটির কয়েক ডজন নিবন্ধ: http://today.java.net/pub/a/today/2005/03/09/factory.html

কারখানার মধ্যে একটি ক্লাস ব্যবহার করা বিভিন্ন উপায়ে সম্পন্ন করা যায়, বিশেষত একটি কনফিগার ফাইল থাকায় শ্রেণীর নাম রয়েছে যা প্রয়োজনীয় ইন্টারফেস প্রয়োগ করে। তারপরে কারখানাটি শ্রেণীর পথের মধ্যে থেকে শ্রেণিটি সন্ধান করতে পারে এবং নির্দিষ্ট ইন্টারফেসের অবজেক্ট হিসাবে এটি তৈরি করতে পারে।


0

যেমনটি আপনি বলেছেন GWT প্রতিবিম্ব সমর্থন করে না। আপনার প্রতিবিম্বের পরিবর্তে স্থগিত বাইন্ডিং বা তৃতীয় পক্ষের লাইব্রেরি যেমন gwt-ent যেমন gwt স্তরে প্রতিচ্ছবি সাপোর্টপোর্ট ব্যবহার করা উচিত for



-1

জাভা এর প্রতিবিম্ব টিউটোরিয়াল এবং প্রতিবিম্ব এপিআই দেখুন:

https://commune.oracle.com/docs/DOC-983192 লিঙ্কের বিবরণ এখানে লিখুন

এবং

http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html


ওপি স্পষ্টভাবে জানিয়েছে যে তিনি জিডব্লিউটি ব্যবহার করছেন যা প্রতিচ্ছবি সমর্থন করে না
নর্ফ

2
প্রশ্নটি আমার উত্তরের অনেক পরে সম্পাদিত হয়েছিল। মূল প্রশ্নটিতে সেই ইঙ্গিতটি অন্তর্ভুক্ত ছিল না। গৃহীত উত্তরটিও উপায় দ্বারা প্রতিবিম্বের কথা উল্লেখ করছে।
মারকাস গ্র্যান্ডেলর

-1

পরামিতি হিসাবে বর্গ। উদাহরণ।

তিনটি শ্রেণি:

class TestCar {

    private int UnlockCode = 111;
    protected boolean hasAirCondition = true;
    String brand = "Ford";
    public String licensePlate = "Arizona 111";
}

-

class Terminal {

public void hackCar(TestCar car) {
     System.out.println(car.hasAirCondition);
     System.out.println(car.licensePlate);
     System.out.println(car.brand);
     }
}

-

class Story {

    public static void main(String args[]) {
        TestCar testCar = new TestCar();
        Terminal terminal = new Terminal();
        terminal.hackCar(testCar);
    }

}

ক্লাস টার্মিনাল পদ্ধতিতে হ্যাককার () ক্লাসের টেস্টকারকে প্যারামিটার হিসাবে গ্রহণ করুন।


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