What does "()V" mean in a class signature?

Evils picture Evils · Mar 28, 2012 · Viewed 9.5k times · Source

I created a constructor with Javassist which has no real method

CtConstructor c = CtNewConstructor.make ( argTypes, null, newClass );

When I'm trying to put out the signature of this class

c.getSignature();

I get

public Echo ()V

I'm confused what "V" means? I expected either public Echo (); or something similar...

Answer

Simon Nickerson picture Simon Nickerson · Mar 28, 2012

The JVM uses a compact way of storing method signatures, of which constructors are considered a special case.

For your example:

  • () indicates a method taking no arguments
  • V indicates that it returns nothing

The other parts of the scheme are:

  • B - byte
  • C - char
  • D - double
  • F - float
  • I - int
  • J - long
  • S - short
  • V - void
  • Z - boolean
  • [ - array of the thing following the bracket
  • L [class name] ; - instance of this class, with dots becoming slashes
  • ( [args] ) [return type] - method signature

For example:

public int foo(String bar, long[][] baz)

would become

(Ljava/lang/String;[[J)I

See the spec at Sun^H^H^HOracle's web site