题目:利用反射和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",它便成功运行了。
所以,类的全路径 = 包名 + 类名