//动态加载类
//Class.forName("类的全称")代表该类类类型,还代表了动态加载类
//编译时刻加载的是静态加载类,运行加载是动态加载类。
Word.java
class Word { public void start(){ System.out.println("word..is..starting"); } }
Office.java
class Office{
public static void main(String[] args){
//new 静态加载
System.out.println("Hi");
if("Word".equals(args[0])){
Word w = new Word();
w.start();
}
if("Excel".equals(args[0])){
Excel e = new Excel();
e.start();
}
}
}
在Office.java中new属于静态加载,编译器会在编译时加载,因为找不到Excel就会报错
Word1.java
class Word1 implements OfficeAbel{ public void start(){ System.out.println("word..is..starting"); } }
OfficeAbel.java
interface OfficeAbel{ public void start(); }
Office1.java
class Office1{
public static void main(String[] args) {
try {
Class c = Class.forName(args[0]);
OfficeAbel oa = (OfficeAbel)c.newInstance();
oa.start();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Class.forName代表了动态加载类,运行加载是动态加载类。
总结:可以在有很多功能时让各个子模块实现,而不用在编译时因为一个子模块导致其他模块不能用
反射重新赋对象值
HccyPlateRolling hp = new HccyPlateRolling();
Field[] fields = hccyPlateRolling.getClass().getDeclaredFields();
for (int j = 0; j < fields.length; j++) {
try {
fields[j].setAccessible(true);
Object value = fields[j].get(hccyPlateRolling);
if (null != value) {
fields[j].set(hp, value);
}
fields[j].setAccessible(false);
} catch (Exception e) {
}
}
参考链接:
https://www.imooc.com/learn/199