मैं जावा में पैरामीटर के रूप में एक कक्षा कैसे पास कर सकता हूं?


136

क्या जावा में पैरामीटर के रूप में कक्षा पास करने और उस कक्षा से कुछ तरीकों को आग लगाने का कोई तरीका है?

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

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

मैं Google वेब टूलकिट का उपयोग कर रहा हूं और यह प्रतिबिंब का समर्थन नहीं करता है।

जवाबों:


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);
         }
      }
   }

और देखें


और मैं उस कक्षा में डिफ़ॉल्ट कंस्ट्रक्टर या कुछ तरीकों को कैसे फायर करूं?

क्षमा करें, मैं Google वेब टूल किट और सामान जोड़ना भूल गया, Google वेब टूलकिट का उपयोग कर रहा हूं और यह प्रतिबिंब का समर्थन नहीं करता है।


मैं दर्शन के बारे में बात करना चाहता हूँ! क्या जावा में क्लास एक डेटा प्रकार है?
मिलाद रहीमी

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
}

A 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 टैग देखा है। आप GWT में प्रतिबिंब का उपयोग नहीं कर सकते


1

मुझे यकीन नहीं है कि आप क्या हासिल करने की कोशिश कर रहे हैं, लेकिन आप इस पर विचार करना चाह सकते हैं कि कक्षा पास करना वह नहीं है जो आपको वास्तव में करने की आवश्यकता है। कई मामलों में, क्लास के साथ इस तरह से व्यवहार करना किसी प्रकार के कारखाने पैटर्न के भीतर आसानी से समझाया जाता है और इसका उपयोग एक इंटरफ़ेस के माध्यम से किया जाता है। यहाँ उस पैटर्न पर दर्जनों लेखों में से एक है: http://today.java.net/pub/a/today/2005/03/09/factory.html

एक कारखाने के भीतर एक वर्ग का उपयोग कई तरीकों से पूरा किया जा सकता है, सबसे विशेष रूप से एक कॉन्फ़िगर फ़ाइल होने से जिसमें उस वर्ग का नाम होता है जो आवश्यक इंटरफ़ेस को लागू करता है। तब कारखाना उस वर्ग को वर्ग पथ के भीतर से ढूंढ सकता है और उसे निर्दिष्ट इंटरफ़ेस के ऑब्जेक्ट के रूप में निर्मित कर सकता है।


0

जैसा कि आपने कहा कि जीडब्ल्यूटी प्रतिबिंब का समर्थन नहीं करता है। आपको प्रतिबिंब के बजाय आस्थगित बंधन का उपयोग करना चाहिए, या तीसरे पक्ष के पुस्तकालय जैसे कि gwt- gwt पर प्रतिबिंब परावर्तन के लिए परत।



-1

जावा के प्रतिबिंब ट्यूटोरियल और प्रतिबिंब एपीआई पर एक नज़र डालें:

https://community.oracle.com/docs/DOC-983192 यहां लिंक विवरण दर्ज करें

तथा

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


ओपी ने स्पष्ट रूप से कहा कि वह GWT का उपयोग कर रहा है जो प्रतिबिंब का समर्थन नहीं करता है
नार्फ

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);
    }

}

क्लास टर्मिनल मेथड में hackCar () पैरामीटर के रूप में क्लास टेस्टकर ले।


1
उम्म नहीं, यह
Towc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.