Class.forName不能加载abstract原因
今天看到单例模式时,突然想起,单例模式的情况是不让其他类来构造这个类本身,也就是不让new构造器,所以我们一般都会私有化这个构造器。我们知道abstract类是不能实例化的,我想利用abstract这个特性来构造成一个abstract单例模式,程序清单如下,能正常编译,测试发现报错。
package com.wxw;
public abstract class AbsSingle {
public static AbsSingle getInstance(){
AbsSingle newInstance = null;
try {
newInstance = (AbsSingle) Class.forName(AbsSingle.class.getName()).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return newInstance;
}
}
报的这个异常
java.lang.InstantiationException
实例化异常。当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常。
为什么会报这个异常了?
我推测,newInstance是反射调用的构造器,也就是说只有含有构造器的类才允许被实例化,这也验证了java规范里面的定义,看一下java反射机制的定义,定义摘自百度百科
--------JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
看到这里,觉得反射机制能够对任意一个类,如果按照百度百科这个说法,对于abstract类也可以使用这种机制直接得到
经过一翻尝试,各种能想到的办法我都试过了,用反射是不能得到一个抽象类的实例的,原因是:抽象类本身是编译时的概念,不具有具体的运行时信息,所以这个需求,达不到。结合这个信息,我得知如果利用抽象类去实现单例模式,不可行。所以百度百科这个"对于任意一个类",得改成"对于任意一个可实例化的类"。这样才合理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南