自定义Person类,并给定一个带参构造, 当Person类的反射对象调用newInstance时会报错,为什么?用java代码举例
时间: 2024-02-05 14:14:23 浏览: 80
java反射机制介绍及使用
当使用反射调用 `newInstance()` 方法时,需要保证类中的所有构造函数都是可访问的(即为 public),否则会抛出 `IllegalAccessException` 异常。
以下是一个例子,Person 类只有一个带参构造函数,且该构造函数为 private,因此在使用反射创建实例时会抛出异常:
```java
public class Person {
private Person(String name) {
System.out.println("Hello, " + name);
}
}
public class Main {
public static void main(String[] args) {
try {
Class<?> c = Class.forName("Person");
Constructor<?> constructor = c.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
Object obj = constructor.newInstance("Tom"); // 抛出 IllegalAccessException 异常
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
如果将 Person 类的构造函数改为 public,则可以正常创建实例:
```java
public class Person {
public Person(String name) {
System.out.println("Hello, " + name);
}
}
public class Main {
public static void main(String[] args) {
try {
Class<?> c = Class.forName("Person");
Constructor<?> constructor = c.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
Object obj = constructor.newInstance("Tom");
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
阅读全文