আমি কি কনস্ট্রাক্টর আর্গুমেন্ট সহ Class.newInstance () ব্যবহার করতে পারি?


240

আমি ব্যবহার করতে চাই Class.newInstance()তবে আমি যে ক্লাসটি ইনস্ট্যান্ট করছি তাতে কোনও নালারী কনস্ট্রাক্টর নেই। সুতরাং আমি কনস্ট্রাক্টর আর্গুমেন্টে পাস করতে সক্ষম হওয়া প্রয়োজন। এই কাজ করতে একটি উপায় আছে কি?


1
বিবেচনার জন্য দুর্দান্ত উত্তর হ'ল ক্রিস জাস্টার-ইয়ং।
ডামিয়ান রাফায়েল লাটেনেরো

উত্তর:


205
MyClass.class.getDeclaredConstructor(String.class).newInstance("HERESMYARG");

অথবা

obj.getClass().getDeclaredConstructor(String.class).newInstance("HERESMYARG");

24
কেবল স্পষ্ট করা - getDeclaredConstructorকোনও স্থির পদ্ধতি নয়, আপনার নির্দিষ্ট শ্রেণির জন্য আপনাকে ক্লাসের উদাহরণে কল করতে হবে।

1
উত্তরটি জাভা ১.১ এর জন্য "না" বলে মনে হচ্ছে
জিম

আমার কাছে তালিকা <স্ট্রিং> পরামিতি সহ পাবলিক কনস্ট্রাক্টর রয়েছে। এটি getDeclaredConstructor দ্বারা পেতে পারি না, তবে getConstructor দিয়ে ভাল কাজ করে। তুমি কি জানো কেন?
লাইন

It should be noted that this requires you to catch a whole slew of exceptions. When I realized there were at least 4, I just threw it in a try/catch block. Also, the arguments to getDeclaredConstructor() are the classes of the constructor parameters
Andrew Puglionesi

89
myObject.getClass().getDeclaredConstructors(types list).newInstance(args list);

সম্পাদনা করুন: মতামত অনুসারে মনে হচ্ছে শ্রেণিবদ্ধকরণ এবং পদ্ধতির নাম কিছু ব্যবহারকারীর পক্ষে যথেষ্ট নয়। আরও তথ্যের জন্য কনডাক্টর পেতে এবং এটি আহ্বান জানাতে ডকুমেন্টেশনটি একবার দেখুন ।


18
উত্তর আপনি কীভাবে অর্গগুলি পাস করবেন না বা উদাহরণ দেখান তা বলে না। এটা শুধু অনুমান।
jangofan

2
এটি কি ডিক্লেয়ারড কনস্ট্রাক্টর (একক) হওয়া উচিত?
লুক স্কাইওয়াকার

2
@ রিওয়ান্টেজ এটিকে স্থির পদ্ধতির মতো দেখায় না কারণ এগুলি সবই "মাইবজেক্ট" উদাহরণে বলা হচ্ছে। এটি কেবল পদ্ধতি কলগুলির একটি ডেইজি চেইন। তবে এই উত্তরটি ভুল না হওয়ায় 55 জনের পক্ষে কেন এটি কার্যকর ছিল তা নিশ্চিত নয় এবং সঠিকটি নীচে রয়েছে!
অরণান

72

ধরে নিচ্ছি আপনার নীচের কনস্ট্রাক্টর রয়েছে

class MyClass {
    public MyClass(Long l, String s, int i) {

    }
}

আপনাকে এই নির্মাতাকে এভাবে ব্যবহার করার ইচ্ছেটি দেখাতে হবে:

Class classToLoad = MyClass.class;

Class[] cArg = new Class[3]; //Our constructor has 3 arguments
cArg[0] = Long.class; //First argument is of *object* type Long
cArg[1] = String.class; //Second argument is of *object* type String
cArg[2] = int.class; //Third argument is of *primitive* type int

Long l = new Long(88);
String s = "text";
int i = 5;

classToLoad.getDeclaredConstructor(cArg).newInstance(l, s, i);



8

প্যারামিটারাইজড কনস্ট্রাক্টরকে কল করতে নীচের পদক্ষেপগুলি অনুসরণ করুন।

  1. পান Constructorধরনের ক্ষণস্থায়ী দ্বারা প্যারামিটার ধরনের সঙ্গে Class[] জন্য getDeclaredConstructorপদ্ধতিClass
  2. মান ক্ষণস্থায়ী দ্বারা কন্সট্রাকটর দৃষ্টান্ত তৈরি Object[]জন্য
    newInstanceপদ্ধতিConstructor

উদাহরণ কোড:

import java.lang.reflect.*;

class NewInstanceWithReflection{
    public NewInstanceWithReflection(){
        System.out.println("Default constructor");
    }
    public NewInstanceWithReflection( String a){
        System.out.println("Constructor :String => "+a);
    }
    public static void main(String args[]) throws Exception {

        NewInstanceWithReflection object = (NewInstanceWithReflection)Class.forName("NewInstanceWithReflection").newInstance();
        Constructor constructor = NewInstanceWithReflection.class.getDeclaredConstructor( new Class[] {String.class});
        NewInstanceWithReflection object1 = (NewInstanceWithReflection)constructor.newInstance(new Object[]{"StackOverFlow"});

    }
}

আউটপুট:

java NewInstanceWithReflection
Default constructor
Constructor :String => StackOverFlow

1

আপনি getDeclaredConstructorক্লাসের পদ্ধতিটি ব্যবহার করতে পারেন । এটি ক্লাসগুলির একটি অ্যারের প্রত্যাশা করে। এখানে একটি পরীক্ষিত এবং কাজের উদাহরণ:

public static JFrame createJFrame(Class c, String name, Component parentComponent)
{
    try
    {
        JFrame frame = (JFrame)c.getDeclaredConstructor(new Class[] {String.class}).newInstance("name");
        if (parentComponent != null)
        {
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        else
        {
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        }
        frame.setLocationRelativeTo(parentComponent);
        frame.pack();
        frame.setVisible(true);
    }
    catch (InstantiationException instantiationException)
    {
        ExceptionHandler.handleException(instantiationException, parentComponent, Language.messages.get(Language.InstantiationExceptionKey), c.getName());
    }
    catch(NoSuchMethodException noSuchMethodException)
    {
        //ExceptionHandler.handleException(noSuchMethodException, parentComponent, Language.NoSuchMethodExceptionKey, "NamedConstructor");
        ExceptionHandler.handleException(noSuchMethodException, parentComponent, Language.messages.get(Language.NoSuchMethodExceptionKey), "(Constructor or a JFrame method)");
    }
    catch (IllegalAccessException illegalAccessException)
    {
        ExceptionHandler.handleException(illegalAccessException, parentComponent, Language.messages.get(Language.IllegalAccessExceptionKey));
    }
    catch (InvocationTargetException invocationTargetException)
    {
        ExceptionHandler.handleException(invocationTargetException, parentComponent, Language.messages.get(Language.InvocationTargetExceptionKey));
    }
    finally
    {
        return null;
    }
}

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