1. 自定义Person类,并给定一个带参构造, 当Person类的反射对象调用newInstance时会报错,写个例子演示,并说明为什么?
时间: 2024-02-06 11:10:36 浏览: 67
下面是一个自定义的Person类,带有一个带参构造函数:
```java
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
```
当使用反射创建该类的对象时,会报InstantiationException异常。代码如下:
```java
try {
Class<?> clazz = Class.forName("Person");
Object obj = clazz.newInstance(); // 报错
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
```
报错信息如下:
```
java.lang.InstantiationException: Person
at java.lang.Class.newInstance(Class.java:427)
at Main.main(Main.java:8)
Caused by: java.lang.NoSuchMethodException: Person.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.newInstance(Class.java:412)
... 1 more
```
为什么会报错呢?因为自定义的Person类只有一个带参构造函数,没有无参构造函数,而使用反射创建对象时,如果该类没有无参构造函数,就会抛出InstantiationException异常。解决方法是为该类添加一个无参构造函数:
```java
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() { // 添加无参构造函数
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
```
这样,在使用反射创建对象时就不会报错了。
阅读全文