This discussion is archived
3 Replies Latest reply: May 7, 2012 4:43 AM by BIJ001 RSS

Class.getMethods() failing

dornibe Newbie
Currently Being Moderated
Say we have a class "MyClassToCheck" with code below.

From another application I want to check if the class' method signatures conform to a certain spec without having all dependencies needed. (as indicated by "ClassNotOnClasspath").
In this App I load the class with "forName" and then call getMethods() on it.

....
cl = Class.forName("checkit.MyClassToCheck");
Method[] meth=cl.getMethods();
....

Of course the class must not have a static member of a type being unavailable at checking time. This would cause "Class.forName" to fail.

But why do I get a NoClassDefFoundError on "getMethods()" when a var of the unknown type is declared in a try catch block??

Can anybody help?

Thx,
Bernhard

---------------------------------------------------

package checkit;

import refl.ReflTest2.AnotherParamOnClassPath;
import refl.ReflTest2.ParamOnClassPath;
import refl.ReflTest2.RetValOnClassPath;
import tocheck.ClassNotOnClassPath;


class MyClassToCheck
{
ClassNotOnClassPath instance_member1=new ClassNotOnClassPath();; // --> WORKS !!
//static ClassNotOnClassPath static_member1=new ClassNotOnClassPath(); // --> DOES NOT WORK which is comprehensible!!


public RetValOnClassPath myMethodName( ParamOnClassPath par1, AnotherParamOnClassPath par2)
{
ClassNotOnClassPath local=new ClassNotOnClassPath(); // --> WORKS !!

if(System.getProperty("aProperty")!=null)
{
ClassNotOnClassPath blocklocal=new ClassNotOnClassPath(); // --> WORKS !!
System.out.println(blocklocal);
}

try {
*//ClassNotOnClassPath trylocal=new ClassNotOnClassPath(); // DOES NOT WORK !!!*
RetValOnClassPath rv=new RetValOnClassPath();
}
catch(Exception e)
{
e.printStackTrace();
}

return new RetValOnClassPath();
}
}
  • 1. Re: Class.getMethods() failing
    EJP Guru
    Currently Being Moderated
    The class isn't being executed when it is loaded, so where the unresolvable reference is in the code can't possibly make any difference.
  • 2. Re: Class.getMethods() failing
    dornibe Newbie
    Currently Being Moderated
    So I had thought too.
    But it does matter.
    Some more experiments showed that Class.forName fails on code containing a var decl using an unresolvable class in a try block if that code was compiled with Java 1.4 or Java 5. It does not fail when the code is compiled with J6 or 7. Must have something to do with the bytecode definition. Have tried only with Sun/Oracle Java compilers/VMs and Eclipse's built in JDT compiler/generator.
  • 3. Re: Class.getMethods() failing
    BIJ001 Explorer
    Currently Being Moderated
    if that code was compiled with Java 1.4 or Java 5. It does not fail when the code is compiled with J6 or 7
    It would not wonder me if an older version JVM could not resolve classes compiled with a newer version of JVM.

Legend

  • Correct Answers - 10 points
  • Helpful Answers - 5 points