写在前面的话:
- IDE:eclipse
- JDK:Java8
- 知识点:了解JavaSE中的反射
- 本章内容:记录反射中常遇到的一些错误
目录
1.错误信息的几种情况
1.1参数错误
源代码:错误的源代码!
import java.lang.reflect.InvocationTargetException;
//通过反射来获取对象,并调用方法
public class TestReflect2 {
public static void main(String[] args) throws Exception {
/*
* 错误示范:
*/
//创建一个类
Class<Student> clazz = Student.class;
//创建一个clazz对应的Student类的对象
Student student = clazz.getDeclaredConstructor(Student.class).newInstance();
}
}
报错信息:
Exception in thread "main" java.lang.NoSuchMethodException: fly.Student.<init>(fly.Student)
at java.base/java.lang.Class.getConstructor0(Class.java:3585)
at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2754)
at fly.TestReflect2.main(TestReflect2.java:19)
1.2获取了带参数的构造器,实例化对象时没有填入参数
源代码:错误的源代码!
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
//通过反射来获取对象,并调用方法
public class TestReflect2 {
public static void main(String[] args) throws Exception {
/*
* 错误示范:
*/
//创建一个类
Class<Student> clazz = Student.class;
//获取带参数的构造器
Constructor<Student> constructor = clazz.getDeclaredConstructor(String.class);
//由获取的构造器创建一个对象
Student student = constructor.newInstance();
//打印
System.out.println(student);
}
}
报错信息:
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
at fly.TestReflect2.main(TestReflect2.java:23)
1.3 设计的类中没有对应的构造器
测试类的源代码是正确的:
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
//通过反射来获取对象,并调用方法
public class TestReflect2 {
public static void main(String[] args) throws Exception {
/*
* 错误示范:
*/
//创建一个类
Class<Student> clazz = Student.class;
//获取带参数的构造器
Constructor<Student> constructor = clazz.getDeclaredConstructor(String.class);
//由获取的构造器创建一个对象
Student student = constructor.newInstance("张三");
//打印
System.out.println(student);
}
}
设计的学生类中没有带String参数类型的构造器(这里是把它注释):
public class Student {
private String name;
private int age;
public Student() {
}
public Student(int age) {
super();
this.age = age;
}
// public Student(String name) {
// super();
// this.name = name;
// }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void show() {
System.out.println("----------------------------");
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
报错信息:(与第1种情况似类)
Exception in thread "main" java.lang.NoSuchMethodException: fly.Student.<init>(java.lang.String)
at java.base/java.lang.Class.getConstructor0(Class.java:3585)
at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2754)
at fly.TestReflect2.main(TestReflect2.java:20)
2.正确写法
测试反射的类
import java.lang.reflect.Constructor;
//通过反射来获取对象,并调用方法
public class TestReflect2 {
public static void main(String[] args) throws Exception {
/*
* 正确示范:
*/
//创建一个类
Class<Student> clazz = Student.class;
//获取带参数的构造器
Constructor<Student> constructor = clazz.getDeclaredConstructor(String.class,Integer.class);
//由获取的构造器创建一个对象
Student student = constructor.newInstance("张三",18);
//打印
System.out.println(student);
}
}
设计的学生类
public class Student {
private String name;
private Integer age;
public Student() {
}
public Student(Integer age) {
super();
this.age = age;
}
public Student(String name) {
super();
this.name = name;
}
public Student(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void show() {
System.out.println("----------------------------");
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
输出结果:
完