动态编译

前几天谈论了关于动态编译的问题,与动态编译相对的肯定就是静态编译。
静态编译:在编译时确定类型,绑定对象
动态编译:在运行时确定类型,绑定对象。动态编译发挥了java的灵活性的优点。
定义一个接口

 

该接口的实现类

/**
 * Benz类实现IVehicle接口
 */
public class Benz{

 public static final String company = "Benz公司";
 额
 public int energy;
 
 public Benz(){
  this.energy = 10;
 }
 
 public Benz(int energy){
  this.energy = energy;
 }
 
 //启动
 public void startMe(){
  System.out.println("Benz启动...");
 }

 //前进
 public int forward(int dins){
  energy -= dins/100;
  System.out.println("Benz前进..."+dins);
  return energy;
 }

 //还有多少能量
 public int getEnergy(){
  return this.energy;
 }
}

 
在定义一个主类,使用静态编译的方法,在编译是就确定其类型

public class MainTest{
 public static void main(String[] args){
  Benz benz = new Benz();
  benz.forward(100);
 }
}

 
动态编译,从键盘读取输入的类名,从而得到其对象,关键语句,
 

 Class c = Class.forName(className);
  Object object = c.newInstance();
public class MainTest{
 public static void main(String[] args){
  Scanner scanner = new Scanner(System.in);
  String className = scanner.next();
  Class c = Class.forName(className);
  Object object = c.newInstance();
  IVehicle ve = (IVehicle)object;
 }
}

 通过对象回去该类的详细信息
  Class c1 = ve.getClass();
  String c1Name = c1.getName();
  System.out.println(c1Name);
  
  Method[] methods = c1.getMethods();//得到类中方法对象的数组
  Constructor[] cons = c1.getConstructors();//得到类定义的构造器的数组
  Field[] fields = c1.getFields();//得到类属性的数组
  Class superClass = c1.getSuperclass();//得到其父类
  Class[] interfaces = c1.getInterfaces();//得到其实现的接口

你可能感兴趣的:(动态编译)