无论是哪个的newInstance都是用来创建对象的。 ①构造方法Constructor的newInstance()使用时,要传入参数,这个参数要与获得constructor(即使用getConstructor获得)时的一样。而Class 的newInstance()没有参数。因此,就要求Class对象的这个类要明确有无参的构造函数。 ②假如一个类,没有写构造函数,那么会被自动加上一个无参的构造函数,是可以使用Class的newInstance的。 ③如果类中有且都是非空参数的构造函数,那么就不能使用。除非在类中明确写出这个空参构造函数。 下面通过代码来验证。
代码示例:验证① - package com.asin;
- import java.lang.reflect.Constructor;
- public class ReflectTest {
- public static void main(String[] args) throws Exception {
- Constructor constructor1=String.class.getConstructor(StringBuffer.class);
- String string = (String)constructor1.newInstance(new StringBuffer("abc"));
- System.out.println(string);
- }
- }
复制代码
运行结果:abc
如果第二个参数与第一次的不一样,将第二个的参数改成String对象 - Constructor constructor1=String.class.getConstructor(StringBuffer.class);
- String string = (String)constructor1.newInstance("abc");
- System.out.println(string);
复制代码
则会报错:
Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch 抛出的异常表明向方法传递了一个不合法或不正确的参数。
验证②:一个类,没有写构造函数,那么会被自动加上一个无参的构造函数,是可以使用Class的newInstance的。 - package com.asin;
- import java.lang.reflect.Constructor;
- public class ReflectTest {
- public static void main(String[] args) throws Exception {
- Person per = Person.class.newInstance();
- System.out.println(per);
-
- }
- }
- class Person
- {
- String name;
- int age;
-
- }
复制代码
运行结果: com.asin.Person@1aaf64d
验证③:如果类中有且都是非空参数的构造函数,那么就不能使用。除非在类中明确写出这个空参构造函数。 - package com.asin;
- import java.lang.reflect.Constructor;
- public class ReflectTest {
- public static void main(String[] args) throws Exception {
- Person per = Person.class.newInstance();
- System.out.println(per);
-
- }
- }
- class Person
- {
- String name;
- int age;
-
- public Person(String name, int age) {
-
- this.name = name;
- this.age = age;
- }
-
- }
复制代码
运行报错: Exception in thread "main" java.lang.InstantiationException: com.asin.Person 帮助文档说明: InstantiationException - 如果此Class 表示一个抽象类、接口、数组类、基本类型或 void; 或者该类没有 null 构造方法; 或者由于其他某种原因导致实例化失败。 修改代码为: - package com.asin;
- import java.lang.reflect.Constructor;
- public class ReflectTest {
- public static void main(String[] args) throws Exception {
- Person per = Person.class.newInstance();
- System.out.println(per);
-
- }
- }
- class Person
- {
- String name;
- int age;
-
-
- public Person() {
-
- }
- public Person(String name, int age) {
- this.name = name;
- this.age = age;
- }
-
- }
复制代码
运行结果:com.asin.Person@1aaf64d
演示:用这两种方法实例化一个String对象 String(byte[] bytes) 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。 - //方法一(前提是类中有空参数构造函数,比如Integer就不能这样实例化)
- //声明String对象str1
- String str1 = (String)Class.forName("java.lang.String").newInstance();
- //给str1赋值
- str1 = new String(new byte[]{1,2,3});
-
- //方法二
- //得到String的传入字节数组参数的构造方法
- Constructor constructor = Class.forName("java.lang.String").getConstructor(byte[].class);
- //声明并赋值
- String str2 = (String)constructor.newInstance(new byte[]{1,2,3});
复制代码
|