java高级开发学习之--反射机制(1)
- 类本身就是一个对象,类是java.lang.Class类的实例对象。
任何一个类都是Class的实例对象,这个实例对象有三种表示方式
Foo foo1 = new Foo();第一种: Class c1 = Foo.class;
第二种: Class c2 = foo1.getClass();
System.out.println(c1 == c2); (结果是 true)
第三种:Class c3 = null;
try {
c3 = Class.forName("com.tr.lmh_sb.Foo");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(c2==c3);
//可以通过类的类类型创建该类的对象实例
try {
Foo f = (Foo)c1.newInstance();//创建对象的前提是 得有无参数的构造方法
f.print();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
例子:Office类
class Office
{
public static void main(String[] args)
{
//new 创建对象其实是静态加载类,在编译时刻就需要加载所有的可能使用到的类
//这个类是有问题的,现在没有Word类Excel类,所以编译肯定不能通过,而且Word、Excel其中只要有一个有问题,整个程序就不能运行。
//解决方案:通过动态加载类可以解决该问题
if("Word".equals(args[0])){
Word w = new Word();
w.start();
}
if("Excel".equals(args[0])){
Excel e = new Excel();
e.start();
}
System.out.println("Hello World!");
}
}
解决方案:OfficeBetter代替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();
}
}
}
class Word implements OfficeAble {
public void start()
{
System.out.println("Word start..");
}
}
interface OfficeAble {
public void start();
}
总结:1.功能性的类尽量使用动态加载,方便功能的添加删除。
2.提高自己的设计思想.