java 反射
//动态加载类
//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