package transpotion; import java.lang.reflect.InvocationTargetException; public class ComputeTime { public static void main(String[] args) { System.out.println("Mode of transportation is:"+args[0]); System.out.println("A="+args[1]); System.out.println("B="+args[2]); System.out.println("C="+args[3]); double a=Double.parseDouble(args[1]); double b=Double.parseDouble(args[2]); double c=Double.parseDouble(args[3]); double v,t; try { Common d=(Common) Class.forName("transpotion." +args[0]).getDeclaredConstructor().newInstance(); v=d.speed(a,b,c); t=1000/v; System.out.println("速度=:"+v+"km/h"); System.out.println("时间=:"+(float)t+"h"); } catch(ClassNotFoundException| InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { System.out.println("class not found"); } } } package transpotion; public interface Common { double speed(double a,double b,double c); } package transpotion; public class Car007 implements Common{ public double speed(double a, double b, double c) { if(c==0) { System.out.println("Divisor cannot be 0"); return 0; } else return a*b/c; } } package transpotion; public class Plane implements Common { public double speed(double a, double b, double c) { return a+b+c; } } package transpotion; public class Ship implements Common { public double speed(double a,double b,double c) { return a*b+a*c; } }可以为我讲解一下这段代码吗
时间: 2024-02-14 14:22:53 浏览: 65
这段代码是一个关于交通工具速度计算的示例程序,使用了Java语言实现。程序通过命令行输入三个参数,分别是交通工具名称、A参数、B参数和C参数,然后根据输入的交通工具名称使用反射机制创建对应的对象,调用该对象的速度计算方法,计算出速度和时间,并将结果输出。
其中,交通工具类实现了一个Common接口,该接口定义了一个速度计算的方法,不同的交通工具实现该接口方法的逻辑不同。Car007类实现了该接口,并重写了speed方法,用于计算汽车的速度;Plane类和Ship类同样实现了该接口,并分别重写了speed方法,用于计算飞机和船的速度。
需要注意的是,在使用反射机制创建对象时,需要通过Class.forName()方法传入完整的类名,包括包名。同时,对象的构造方法需要提供一个无参构造方法,否则将会抛出NoSuchMethodException异常。
相关问题
package step4; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Reflect_stu { public static void main(String[] args) throws InvocationTargetException { //使用反射调用 Class clazz = null; try { clazz = Class.forName("step4.Apple"); /********** Begin *********/ Method setPriceMethod = clazz.getMethod("setPrice", double.class); Constructor appleConstructor = clazz.getConstructor(); Object apple = appleConstructor.newInstance(); setPriceMethod.invoke(apple, 14); Method getPriceMethod = clazz.getMethod("getPrice"); System.out.println(getPriceMethod.invoke(apple)); Method getTotal = clazz.getMethod("getTotal", double.class, int.class); System.out.println(getTotal.invoke(apple, 20, 24)); /********** End *********/ } catch (Exception e) { e.printStackTrace(); } } } class Apple { private double price; private int count; public Apple() { } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public double getTotal(double price, int count) { return price * count; } }
这段代码是一个使用反射调用的示例,它包括一个主类 Reflect_stu 和一个 Apple 类。在主类中,首先使用 Class.forName 方法获取 Apple 类的 Class 对象,然后使用 getMethod 方法获取 Apple 类中的 setPrice、getPrice 和 getTotal 方法,并使用 getConstructor 方法获取 Apple 类的默认构造方法的 Constructor 对象。接着使用 newInstance 方法创建一个 Apple 对象,并使用 invoke 方法调用 setPrice 方法设置 Apple 对象的价格为 14,使用 invoke 方法调用 getPrice 方法获取 Apple 对象的价格并输出,最后使用 invoke 方法调用 getTotal 方法计算 Apple 对象的总价并输出。
请帮忙检查一下代码中的错误:package com.enmo.mdi.distributedcomputing.distributed; import java.util.function.Function; import java.lang.reflect.*; public class Algorithm { public Algorithm() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { } private Double sum(Double... args) { Double num = 0.0; for (Double d: args){ num += d; } return num; } private String add(String... args) { StringBuilder str = new StringBuilder(); for (String s: args){ str.append(s); } return str.toString(); } public static Object callMethod(String name, Object... args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { Class<?> clazz = Class.forName("com.enmo.mdi.distributedcomputing.distributed.Algorithm"); // 获取方法的Method对象 Method method = clazz.getDeclaredMethod(name, Double.class); method.setAccessible(true); // 调用该方法 return method.invoke(null,args); } public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { // sum Double result = (Double) callMethod("sum", 1,2,3,4,5); System.out.println(result); String result1 = (String) callMethod("add", "1", "2", '3'); System.out.println(result1); } }
代码中的问题是:
1. 在调用callMethod()方法时,传入的参数类型不匹配,应该将数字1,2,3,4,5修改为1.0,2.0,3.0,4.0,5.0,即将整型转换为浮点型。对于字符串"3",应该将其改为字符'3'。
2. 在调用callMethod()方法时,获取方法的Method对象时,应该使用Double[].class和String[].class而不是Double.class和String.class,因为参数是可变的数组。
修改后的代码如下:
```java
package com.enmo.mdi.distributedcomputing.distributed;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Algorithm {
public Algorithm() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
}
private Double sum(Double... args) {
Double num = 0.0;
for (Double d: args){
num += d;
}
return num;
}
private String add(String... args) {
StringBuilder str = new StringBuilder();
for (String s: args){
str.append(s);
}
return str.toString();
}
public static Object callMethod(String name, Object... args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<?> clazz = Class.forName("com.enmo.mdi.distributedcomputing.distributed.Algorithm");
// 获取方法的Method对象
Method method = clazz.getDeclaredMethod(name, Double[].class);
method.setAccessible(true);
// 调用该方法
return method.invoke(null, (Object) args);
}
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
// sum
Double result = (Double) callMethod("sum", 1.0, 2.0, 3.0, 4.0, 5.0);
System.out.println(result);
String result1 = (String) callMethod("add", "1", "2", "3");
System.out.println(result1);
}
}
```
阅读全文