反射练习题探讨

题目:利用反射和File完成以下功能
    1.    利用Class类的forName方法得到File类
    2.    在控制台打印File类的所有构造器
    3.    通过newInstance的方法创建File对象,并创建D:\mynew.txt文件

在创建File对象时,报出了以下错误:InstantiationException  实例化异常

通过参考他人的博客得知:无无参构造方法导致的异常

这个异常多半是由于通过反射在实例化的时候,对应的类里面覆盖了无参构造而导致无法实例化,由于创建类的时候,默认有一个无参构造,前提是没有其他构造方法,如果没有明确的将无参构造写出来,该类就是缺少无参构造了,也就导致了无法实例化 

查阅帮助文档:File确实没有无参构造

但File类并不是我们自己写的类,无法通过手动添加一个无参构造方法来解决问题,那该怎么办呢?

既然在构造函数这出现了问题,我们可以去帮助文档里搜索Constructor类找找办法

发现,它里面也有一个newInstance方法,而且是带参数的

 所以我们可以通过获取构造器,再调用构造器里的newInstance方法来创建File对象

//获取File的一个构造器
Constructor<?> con = c.getConstructor(String.class);
//用上面得到的构造器创建File对象
File f =(File) con.newInstance("D:\\mynew.txt");
//并创建D:\mynew.txt文件
Method m = c.getMethod("createNewFile");
m.invoke(f);

 这题的完整的代码:

package test;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test2 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        //利用Class类的forName方法得到File类
        Class<?> c = Class.forName("java.io.File");
        //在控制台打印File类的所有构造器
        Constructor<?>[] cons = c.getDeclaredConstructors();
        for(Constructor con : cons){
            System.out.println(con);
        }
        //通过newInstance的方法创建File对象
        //Object o = c.newInstance();//InstantiationException
        //获取File的一个构造器
        Constructor<?> con = c.getConstructor(String.class);
        //用上面得到的构造器创建File对象
        File f =(File) con.newInstance("D:\\mynew.txt");
        //并创建D:\mynew.txt文件
        Method m = c.getMethod("createNewFile");
        m.invoke(f);
    }
}

还有一个小问题,刚开始我并没搞懂什么叫某个类的全路径? 

我利用forName方法去获取Class类的对象,结果却报出了找不到类的异常ClassNotFoundException

//使用Class类中的静态方法forName(String className)
//Class<?> c1 = Class.forName("myReflect.src.test.Student");//ClassNotFoundException

然后我把参数改为"test.Student",它便成功运行了。

所以,类的全路径 = 包名 + 类名 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值