26

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...

Evils
  • 857
  • 3
  • 12
  • 31

3 Answers3

58

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

Simon Nickerson
  • 42,159
  • 20
  • 102
  • 127
7

"V" determines the result type "void"

Philip Helger
  • 1,814
  • 18
  • 28
5

V in a type signature means void type. Bytecode does not differentiate constructors from other methods (other than using special method name).

Eugene Kuleshov
  • 31,461
  • 5
  • 66
  • 67