原来Class就这点用途,大家看我的观点对不?

sure2003 2009-02-24 10:51:30
JButton jb = (JButton) Class.forName("javax.swing.JButton").newInstance();
jb.setBounds(0,0,100,50);
add(jb);

这样也可以添加一个按钮。
那么实际上,这个Class是可用可不用的,是不是?
加载数据库驱动,何必那么麻烦,直接用类名来new不就行了。
欢迎拍我。
...全文
200 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZangXT 2009-02-25
  • 打赏
  • 举报
回复
IDE提供的强大功能也是依赖于反射机制的,用惯了java、c# ide的强大功能,再看C++的ide就很不爽了
龙四 2009-02-25
  • 打赏
  • 举报
回复
加入我给你一个类名作为参数,让你动态的创建一个对象你还能new么!!
uastation 2009-02-25
  • 打赏
  • 举报
回复
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。

Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。

以下示例使用 Class 对象来显示对象的类名:


void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}
还可以使用一个类字面值(JLS Section 15.8.2)来获得命名类型(或 void)的 Class 对象。例如:


System.out.println("The name of class Foo is: "+Foo.class.getName());
uastation 2009-02-25
  • 打赏
  • 举报
回复
Class 类在数据库的驱动里有用到,还有,
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。

Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。

以下示例使用 Class 对象来显示对象的类名:


void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}
还可以使用一个类字面值(JLS Section 15.8.2)来获得命名类型(或 void)的 Class 对象。例如:


System.out.println("The name of class Foo is: "+Foo.class.getName());
nine_suns99 2009-02-25
  • 打赏
  • 举报
回复
同意火龙果的意见,如果没有Class,就没有整个J2EE了,可以说Class和反射技术是J2EE的基石
sure2003 2009-02-25
  • 打赏
  • 举报
回复
动态加载
有什么好处??
bzwm 2009-02-25
  • 打赏
  • 举报
回复
没有class类,反射谁来管?

那类如何动态加载?

它的用途大着呢。
zhouxingyu896 2009-02-25
  • 打赏
  • 举报
回复
学习
mayuanfei 2009-02-25
  • 打赏
  • 举报
回复
Class 可是反射的基础。没有这个类,什么Setter注入啥的都不好使了。
这个类可是相当的关键的。只不过平时不怎么直接用到罢了。
linpyi 2009-02-25
  • 打赏
  • 举报
回复
你不能从应用的地方考虑,应用大家都可以跑,你要从设计的角度考虑

我这样写,可能使代码的可移植性和可从写性增加
linpyi 2009-02-25
  • 打赏
  • 举报
回复
其实楼上他们已经讲的差不多了.从效率上应该差不多.

直接点.

这是直接实例化对象的方法,没什么不对

public void action(){
Test test = new Test1();
test.deal();
}


public void action(String str){
Class class = Class.forName(str);//实例话一个类名为str的对象
Test test = (Test)class;
test.deal();
}

区别
我们把Test看成是一个接口,Test1实现Test接口,我们要使用Test1的方法,用1可以,用2也可以.

如果你现在说,我的action不能这么执行,要多加个更新表的操作,或者说其他的操作.该怎么改

你要修改Test1里面的代码,或者说你加个 Test2,然后修改action中的实例化

而2的话,你只要增加个Test2然后传进去的参数变成Test2就行了,最简单的解耦合

sure2003 2009-02-25
  • 打赏
  • 举报
回复
搞来搞去,就是说在J2SE中,基于桌面开发程序,并没有多大用处。
我new 一个驱动,不行吗?
要到其它数据库上,再修改new 的类即可。
yalanjia 2009-02-25
  • 打赏
  • 举报
回复
两种方法都可以的吧,都是一种创建对象的方法。
cxy550 2009-02-25
  • 打赏
  • 举报
回复
同一 2 楼

一针见血
云上飞翔 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bao110908 的回复:]
直接 new 的话是硬编码在程序中的,不能进行扩展。

也许你注意到了 Class.forName 中的参数是个字符串,是字符串的话那就大有文章可做了,
我们可以利用配置文件来配置具体的实现类,而左边写的是接口,这样的话我们的实现与调
用就可以进行解耦。

根据开-闭原则(OCP),如果在代码中直接写 new Xxxx 的话,以后要新添加另外一个实现类的话,
不得不去修改已有的代码,这样就不符合开-闭原则了。开-闭原则是面向对…
[/Quote]
答:说得很对!
kao331431214 2009-02-25
  • 打赏
  • 举报
回复
路过学习
  • 打赏
  • 举报
回复
另外,需要说明一下的是加载 JDBC 驱动使用的是:

Class.forName,并不是在使用 Class.forName 之后再来个 .newInstance 的。

另外,JDBC 的驱动程序加载方式,必须按照 JDBC 的规范来进行,并不是 new 一个 Driver 类出来就能使用的,
JDBC 驱动需要由 JDBC 的驱动管理器来加载。
  • 打赏
  • 举报
回复
这个类在应用程序开发中很少会去用到的,一般在一些类库开发中用到的会比较多一些。
  • 打赏
  • 举报
回复
直接 new 的话是硬编码在程序中的,不能进行扩展。

也许你注意到了 Class.forName 中的参数是个字符串,是字符串的话那就大有文章可做了,
我们可以利用配置文件来配置具体的实现类,而左边写的是接口,这样的话我们的实现与调
用就可以进行解耦。

根据开-闭原则(OCP),如果在代码中直接写 new Xxxx 的话,以后要新添加另外一个实现类的话,
不得不去修改已有的代码,这样就不符合开-闭原则了。开-闭原则是面向对象设计原则之一,
其核心思想是:对于既有代码的修改是封闭的,对于新增是开放的,这也就是说在新增另一个具体
的实现类的话(比如说:数据库由 MySQL 迁至于 Oracle,我们只要新增一个 Oracle 的 JDBC 操
作类就可以了),具体是由哪个类实现的,我们可以修改配置文件把类名告诉它,这样做的话,我
们不需要对既有代码做任何的改动,只需要新增加一个实现类就可以完成 JDBC 的迁移。

上面说的这也仅仅是利用 Class.forName 进行解耦的方式,Class 类是反射中最为重要和最为基础
的类,这个类描述了 Java 类中所有的元数据。在大家熟悉的 Struts, Spring, Hibernate 这些框
架中用到了很多的反射技术。

在 JDK 5 新增的 Annotation 中,用于 Annotation 的处理的程序也需要用到 Class 中的 getAnnotation
和 isAnnotation 两个方法。

可以这么说吧,如果没有 Class 这个类,那我们基本上就看不到 Spring, Struts, Hibernate 框架,
看不到 Tomcat,看不到 EJB 容器以及整个 J2EE 了。
不善^ 2009-02-24
  • 打赏
  • 举报
回复
跟楼主一样 没有感觉到CLASS这个类的用处 也许以后碰到跟CLASS有关的项目就明白了吧 呵呵

62,614

社区成员

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

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