首先我们先介绍三种加载类的方法,再反射中我们首选第一种,因为我们不知道他的类里有什么,值知道其路径
// 首先加载类
Class cls = Class.forName("cn.csdn.reflect.Student");
// 2、加载类
Student stu = new Student();
Class cls1 = stu.getClass();
System.out.println(cls1);
// 3、加载类
Class cls2 = Student.class;
System.out.println(Student.class);
下面我们来说如何去解析一个类,首先我们去加载类(定义一个Student.class)
Class cls = Class.forName("cn.csdn.reflect.Student");
// 2、通过无参数的构造器解析
Constructor constructor = cls.getConstructor(null);
// 3、创建类的实例
Student stu = (Student) constructor.newInstance(null);
// 4、调用对象的方法
stu.test();
上面是解析没有参数的类的方法,下面我们来解析还有参数的方法同上步骤,代码如下:
Class cls=Class.forName("cn.csdn.reflect.Student"); Constructor constructor=cls.getConstructo(String.class,int.class);
Student entity = (Student)constructor.newInstance("redarmy",90);
//4、调用方法
entity.study();
System.out.println(entity.getName());
下面我们介绍一下关于反射中传值引起的异常(引用redarmy 老师的)
1、错误bug
java.lang.IllegalArgumentException: wrong number of arguments
异常引起的原因分析:
引起错误的原码:
public Student(String strs[]){
System.out.println(strs.length);
}
执行代码:
//解析:public cn.csdn.reflect.Student(java.lang.String[])
@Test
public void test4()throws Exception{
//1、加载类
Class cls = Class.forName("cn.csdn.reflect.Student");
//2、根据构造器参数类型获取相应的构造器对象
Constructor csr = cls.getConstructor(String[].class);
//3、创建实体对象
Student entity = (Student)csr.newInstance(new String[]{});
//4、调用方法
entity.study();
}
编译环境:jdk1.6
错误分析:由于Student(String strs[])构造器只有一个String数组的参数所以这是编译器会把字符串数组当作一个可变长度参数传 给对象strs,而我们取得方法只有一个参数,所以就会出现wrong number of arguments的异常,我们只要把字符串数组强制转换为一 个Object对象就可以解决这个异常了,
解决方案:
//解析:public cn.csdn.reflect.Student(java.lang.String[])
@Test
public void test4()throws Exception{
//1、加载类
Class cls = Class.forName("cn.csdn.reflect.Student");
//2、根据构造器参数类型获取相应的构造器对象
Constructor csr = cls.getConstructor(String[].class);
String str[]={"111","123"};
//3、创建实体对象
Student entity = (Student)csr.newInstance((Object)str);
//4、调用方法
entity.study();
}