Java reflection constructor newinstance

java.lang.reflect.Constructor.newInstance() Method Example

The java.lang.reflect.Constructor.newInstance(Object. initargs) method uses the constructor represented by this Constructor object to create and initialize a new instance of the constructor’s declaring class, with the specified initialization parameters. Individual parameters are automatically unwrapped to match primitive formal parameters, and both primitive and reference parameters are subject to method invocation conversions as necessary.

Declaration

Following is the declaration for java.lang.reflect.Constructor.newInstance(Object. initargs) method.

public T newInstance(Object. initargs) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException

Parameters

initargs − array of objects to be passed as arguments to the constructor call; values of primitive types are wrapped in a wrapper object of the appropriate type (e.g. a float in a Float)

Returns

a new object created by calling the constructor this object represents.

Exceptions

  • IllegalAccessException − if this Constructor object is enforcing Java language access control and the underlying constructor is inaccessible.
  • IllegalArgumentException − if the number of actual and formal parameters differ; if an unwrapping conversion for primitive arguments fails; or if, after possible unwrapping, a parameter value cannot be converted to the corresponding formal parameter type by a method invocation conversion; if this constructor pertains to an enum type.
  • InstantiationException − if the class that declares the underlying constructor represents an abstract class.
  • InvocationTargetException − if the underlying constructor throws an exception.
  • ExceptionInInitializerError − if the initialization provoked by this method fails.

Example

The following example shows the usage of java.lang.reflect.Constructor.newInstance(Object. initargs) method.

package com.tutorialspoint; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class ConstructorDemo < public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException < Constructor constructor = SampleClass.class.getConstructor(String.class); SampleClass sampleObject = (SampleClass)constructor.newInstance("data"); System.out.println(sampleObject.getSampleField()); >> class SampleClass < private String sampleField; public SampleClass()< >public SampleClass(String sampleField) < this.sampleField = sampleField; >public String getSampleField() < return sampleField; >public void setSampleField(String sampleField) < this.sampleField = sampleField; >>

Let us compile and run the above program, this will produce the following result −

Читайте также:  Javascript методы класса date

Источник

Creating New Class Instances

There are two reflective methods for creating instances of classes: java.lang.reflect.Constructor.newInstance() and Class.newInstance() . The former is preferred and is thus used in these examples because:

  • Class.newInstance() can only invoke the zero-argument constructor, while Constructor.newInstance() may invoke any constructor, regardless of the number of parameters.
  • Class.newInstance() throws any exception thrown by the constructor, regardless of whether it is checked or unchecked. Constructor.newInstance() always wraps the thrown exception with an InvocationTargetException .
  • Class.newInstance() requires that the constructor be visible; Constructor.newInstance() may invoke private constructors under certain circumstances.

Sometimes it may be desirable to retrieve internal state from an object which is only set after construction. Consider a scenario where it is necessary to obtain the internal character set used by java.io.Console . (The Console character set is stored in a private field and is not necessarily the same as the Java virtual machine default character set returned by java.nio.charset.Charset.defaultCharset() ). The ConsoleCharset example shows how this might be achieved:

import java.io.Console; import java.nio.charset.Charset; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import static java.lang.System.out; public class ConsoleCharset < public static void main(String. args) < Constructor[] ctors = Console.class.getDeclaredConstructors(); Constructor ctor = null; for (int i = 0; i < ctors.length; i++) < ctor = ctors[i]; if (ctor.getGenericParameterTypes().length == 0) break; >try < ctor.setAccessible(true); Console c = (Console)ctor.newInstance(); Field f = c.getClass().getDeclaredField("cs"); f.setAccessible(true); out.format("Console charset : %s%n", f.get(c)); out.format("Charset.defaultCharset(): %s%n", Charset.defaultCharset()); // production code should handle these exceptions more gracefully >catch (InstantiationException x) < x.printStackTrace(); >catch (InvocationTargetException x) < x.printStackTrace(); >catch (IllegalAccessException x) < x.printStackTrace(); >catch (NoSuchFieldException x) < x.printStackTrace(); >> >

Class.newInstance() will only succeed if the constructor is has zero arguments and is already accessible. Otherwise, it is necessary to use Constructor.newInstance() as in the above example.

Example output for a UNIX system:

$ java ConsoleCharset Console charset : ISO-8859-1 Charset.defaultCharset() : ISO-8859-1

Example output for a Windows system:

C:\> java ConsoleCharset Console charset : IBM437 Charset.defaultCharset() : windows-1252

Another common application of Constructor.newInstance() is to invoke constructors which take arguments. The RestoreAliases example finds a specific single-argument constructor and invokes it:

import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; import java.util.Set; import static java.lang.System.out; class EmailAliases < private Setaliases; private EmailAliases(HashMap h) < aliases = h.keySet(); >public void printKeys() < out.format("Mail keys:%n"); for (String k : aliases) out.format(" %s%n", k); >> public class RestoreAliases < private static MapdefaultAliases = new HashMap(); static < defaultAliases.put("Duke", "duke@i-love-java"); defaultAliases.put("Fang", "fang@evil-jealous-twin"); >public static void main(String. args) < try < Constructor ctor = EmailAliases.class.getDeclaredConstructor(HashMap.class); ctor.setAccessible(true); EmailAliases email = (EmailAliases)ctor.newInstance(defaultAliases); email.printKeys(); // production code should handle these exceptions more gracefully >catch (InstantiationException x) < x.printStackTrace(); >catch (IllegalAccessException x) < x.printStackTrace(); >catch (InvocationTargetException x) < x.printStackTrace(); >catch (NoSuchMethodException x) < x.printStackTrace(); >> >

This example uses Class.getDeclaredConstructor() to find the constructor with a single argument of type java.util.HashMap . Note that it is sufficient to pass HashMap.class since the parameter to any get*Constructor() method requires a class only for type purposes. Due to type erasure, the following expression evaluates to true :

HashMap.class == defaultAliases.getClass()

The example then creates a new instance of the class using this constructor with Constructor.newInstance() .

$ java RestoreAliases Mail keys: Duke Fang

Источник

Оцените статью