关于Class的几个问题

vintager4 2006-03-02 11:49:58
String className="Manager"
1.Class.forName(className)可以获得一个Manager对应的对象?
问题:这个对象是否已经分配空间?是否和new一样呢?
也有说可以加载一个Manager对象,加载的意思是什么?(在很多数据库连接的例子中都使用Class.forName来加载数据库接口类)
2.任何类T都可以使用T.class得到一个对应的Class对象,那Object中为什么没有定义class成员变量?
为什么不能用
T t=new T();
t.class来获得一个Class对象?
...全文
111 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
treeroot 2006-03-02
  • 打赏
  • 举报
回复
Class.forName获得的当然是一个实例,不过是Class的一个实例,而不是你加载的类的实例。

.class是一个类的字面量写法,被编译器处理后相当于在你的类定义了一个静态变量,
使用Class.forName加载的
static Class class$0
static Class class$1 ....
Paripatetic 2006-03-02
  • 打赏
  • 举报
回复
forName方法返回一个对象,这个对象的类型是Class

得到任意对象的类型,Object类中有个方法getClass可以实现
vintager4 2006-03-02
  • 打赏
  • 举报
回复
第一个问题明白了,谢谢
第二问题我想问的是如果T.class中的class 是静态变量,那为什么T的实例却不能调用这个静态变量呢?如果class不是静态变量,那是什么呢?
ChDw 2006-03-02
  • 打赏
  • 举报
回复
1、你返回的是一个Class,而不是一个对象。所以还没有new、分配空间
数据库连接上这样做是因为Class.forName后,JVM会加载这个类,加载其中的静态方法,根据JDBC规范,在类的静态代码中需要向DriverManager注册自己,这样做后DriverManager才可以在调用getConnection时逐个问已经注册的Driver类是否接受用户传入的URL

所以一般我们调用Class.forName后才可以连接数据库

2、你的代码有误:
应该是 Class clz = T.class,是无需new T的,所以这个class不是Object的成员
yanloveyan2004 2006-03-02
  • 打赏
  • 举报
回复
回调吧!
treeroot 2006-03-02
  • 打赏
  • 举报
回复
java语言规范中有这种说明
直接用就OK
知道他是一种类加载快捷方式而已,实际上是调用Class.forName
不过是这样更简洁,让编译器去处理了。
vintager4 2006-03-02
  • 打赏
  • 举报
回复
旗鲁特:.class是一个类的字面量写法,被编译器处理后相当于在你的类定义了一个静态变量,
使用Class.forName加载的
static Class class$0
static Class class$1 ....

大哥能不能再说的仔细些?什么是字面量?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧