【发布时间】:2023-04-10 21:25:01
【问题描述】:
我有一个 Java 项目,其中有 2 个类。我需要使用 Java 反射首先从 mywork.java 类打印由构造函数在 ProjectAccount.java 中设置的默认值,然后我需要重写 toString() 方法以从 mywork.java 类传递值并打印它们。
我能够使用 java 反射来打印默认的构造函数集值。但是在尝试使用参数覆盖和打印toString() 方法时出现错误。
ProjectAccount.java
package relive;
public class ProjectAccount {
private String projectAccountID;
private double budget;
public int noOfProjects;
public ProjectAccount(){
this.projectAccountID = "MARTINDAWS-BillAnalyzer-001";
this.budget = 120000.00;
this.noOfProjects = 10;
}
@Override
public String toString(){
return "Project Accoutn ID = " + projectAccountID + " , Project Budget = "+budget + " , No of Projects = "+ noOfProjects;
}
}
mywork.java
package relive;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class mywork {
public static void main(String[] args) {
try{
Class<?> clazz = Class.forName("relive.ProjectAccount");
Constructor<?> constr = clazz.getDeclaredConstructor(null);
Method mets = clazz.getDeclaredMethod("toString", null);
Object obj = constr.newInstance(new Object[] {});
//Print Default values
System.out.println(mets.invoke(obj, null));
String mod_projectAccountID="ORPT-BT-EMP-DEV";
double mod_budget = 2200000.0;
int mod_noOfProjects = 20;
//Print new passed values using the overridden method
System.out.println(mets.invoke(obj, mod_projectAccountID,mod_budget, mod_noOfProjects));
}
catch(ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e){
e.printStackTrace();
}
}
public static String toString(String mod_projectAccountID, double mod_budget, int mod_noOfProjects){
return "Project Accoutn ID = " + mod_projectAccountID + " , Project Budget = "+mod_budget + " , No of Projects = "+ mod_noOfProjects;
}
}
输出和错误
我猜我遇到了这个错误,因为我还没有覆盖toString() 方法。任何关于我如何覆盖和打印它的建议都将受到高度赞赏。
【问题讨论】:
-
目前尚不清楚为什么您要故意尝试调用具有比它所能接受的更多元素的方法。 mets 完全定义为 ProjectAccount toString 方法,它不带参数。 myWork 类没有扩展 ProjectAccount,那么它的 toString 方法如何以任何方式覆盖 ProjectAccount 实现?
-
因此,与其尝试覆盖和传递修改后的参数,我可以访问变量并修改它们的值并直接调用相同的
toString()方法吗? -
当像你一样使用反射时,你不能改变任何方法的签名——你只能在它们被定义时调用它们。因此 ProjectAccount 方法 toString() 将始终不带任何参数。如果您希望它接受更多参数,您的选择是: 1)在项目帐户中编写另一个 toString 方法,该方法接受参数(您可以保留以前的 toString() 方法,只需添加另一个新方法); 2) 使 ProjectAccount 扩展 myWork - 这将允许您使用带有参数的 toString 的 myWork 版本。
-
我为第二个选项添加了一个解决方案 - 见下文。
标签: java class reflection annotations overriding