<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">一、Class类的使用</span>
任何一个类都是Class类的实例对象,例如有Foo类,它有一个实例对象foo1,Foo这个类也是一个实例对象,即为Class类的实例对象,有三种表示方法:
- Class c1 = Foo.class 实际告诉我们任何一个类都有一个隐含的静态成员
- Class c2 = foo1.getClass() 这种方法需已知该类的对象
- Class c3 = null; c3 = Class.forName("com.dyl.reflect.Foo")
不管c1,c2,c3都代表了Foo的类类型,一个类只可能是Class类的一个实例对象,我们完全可以通过类的类类型创建该类的对象:
Foo foo = (Foo) c1.newInstance();需要有无参数的构造方法
二、动态加载类
Class.forName("类的全称") 不仅表示了类的类类型,还代表了动态加载类,编译时刻加载类是静态加载类、运行时刻加载类是动态加载类
我们用txt写一个Office类
class office{
public static void main(String[] args)
{
if("word".equals(args[0]))
{
Word w = new Word();
w.start();
}
if("Excel".equals(args[0]))
{
Excel e = new Excel();
e.start();
}
}
}
通过javac命令编译,会报错,告诉我们类找不到,方法也找不到:
这时候我们理所当然会认为这个类是错误的,但是我们细想一下,main方法中是一个分支结构,Word类一定用吗?Excel类一定用吗?都不一定,甚至可能都不用,我们在新建一个Word类:
class Word{
public static void start(){
System.out.println("word");
}
}
先编译Word类,在编译Office类:
依然报有两个错,因为虽然有了Word类,但是Excel还是缺乏,因为咱们用的是new创建对象,是静态加载类,在编译时刻就要加载所有的可能使用到的类,但我们想做到的是想用哪个类就加载哪个类,在运行的时刻加载,这时候就可以通过动态加载类来解决这个问题:
创建一个OfficeAble接口:
interface OfficeAble{
public void start();
}
Word类实现该接口
<pre name="code" class="java">class Word implements OfficeAble{
public void start(){
System.out.println("word");
}
}
写一个优化的Office实用类:
class OfficeBetter{
public static void main(String[] args)
{
try{
Class c = Class.forName(args[0]);
//通过类类型创建类对象
OfficeAble oa = (OfficeAble)c.newInstance();
oa.start();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
这样就实现了类的动态加载,一般功能性能性的类提倡用动态加载方式,这样就可以用那部分就实现那部分就行了