为什么java lang nosuchmethoderror在运行时从包装类更改为原语时得到解决
我面临的问题是NoSuchMethodError,即使该方法在我的jar文件中。 服务器:Tomcat 7 Java版本:1.6.0\u 43 异常:为什么java lang nosuchmethoderror在运行时从包装类更改为原语时得到解决,java,oop,wrapper,primitive,nosuchmethoderror,Java,Oop,Wrapper,Primitive,Nosuchmethoderror,我面临的问题是NoSuchMethodError,即使该方法在我的jar文件中。 服务器:Tomcat 7 Java版本:1.6.0\u 43 异常:java.lang.NoSuchMethodError:com.Person.setPersonId(J)V long l1 = 1234; Person p = new Person(); p.setPersonId(l1); NoSuchMethodError请稍候 class Person { Long personId; public
java.lang.NoSuchMethodError:com.Person.setPersonId(J)V
long l1 = 1234;
Person p = new Person();
p.setPersonId(l1);
NoSuchMethodError请稍候
class Person {
Long personId;
public Long getPersonId() {
return personId;
}
public void setPersonId(Long personId) {
this.personId = personId;
}
}
将包装更改为原语时解决了NoSuchMethodError
方法中的
public Long getPersonId()
返回类型为Long。这就是为什么它给出了一个错误 使用primitivelong
,而不是wrapperlong
,原则上这两种代码都很好。很可能编译器看到的代码与运行时使用的代码之间存在不匹配
setPersonId(长personId)
和setPersonId(长personId)
是不同的方法。如果期望的方法不存在,您将不会得到这样的方法错误,而不是像NotThat Method那样的错误
是在Java 1.5中添加的,因此不太可能出现您使用的语言版本在配置上不匹配的情况。请添加stacktrace。您的程序编译和运行良好-问题不在您目前显示的内容中…背景中的某些代码似乎使用了反射。而
Class.getMethod
对于找到具有“兼容”参数类型的方法没有什么神奇的作用。我怀疑问题在于您重新编译了Person
,但没有使用它重新编译代码。我只是问为什么,试图找出为什么会发生这种情况。这个答案只是重申了问题中的信息,您需要解释原因。Java 6中有自动装箱
,因此可以从long转换为long。是的,您完全正确,但在您的情况下,它不会返回long<代码>自动装箱应该作为java概念在这里工作。
class Person {
long personId;
public long getPersonId() {
return personId;
}
public void setPersonId(long personId) {
this.personId = personId;
}
}
long l1 = 1234; here you have declared primitive long
Person p = new Person();
p.setPersonId(l1); in this statement its returning l1 primitive long not Long