漫谈反射机制(一)

本文详细介绍Java反射机制的三种加载类的方法及其实例解析过程,并针对反射中常见的传值异常给出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 


首先我们先介绍三种加载类的方法,再反射中我们首选第一种,因为我们不知道他的类里有什么,值知道其路径

// 首先加载类
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();   
    }  
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值