0 Replies Latest reply on Sep 26, 2006 12:22 PM by Howard Lewis Ship

    3.1: Use of .class causes VerifyError

    Howard Lewis Ship Newbie

      Whenever I try to use the .class construct inside a Javassist method body, I get a VerifyError.

      The text below is from my class transformer; it represents the additions and changes made to a particular class as it is loaded.

      [DEBUG] RenderableUser Finished class transformation: InternalClassTransformation[
      public org.apache.tapestry.integration.app1.components.RenderableUser extends java.lang.Object
       implements org.apache.tapestry.runtime.ComponentLifecycle
      
      add field: protected org.apache.tapestry.internal.InternalComponentResources _$resources;
      
      extend method: public org.apache.tapestry.ComponentResources getComponentResources()
      return _$resources;
      
      add field: protected org.apache.tapestry.services.Environment _$environment;
      
      add method: private org.apache.tapestry.Renderable _$environment_read_renderable()
      return ($r) _$environment.peek(org.apache.tapestry.Renderable.class);
      
      replace read _renderable: _$environment_read_renderable();
      
      add method: private void _write__renderable(org.apache.tapestry.Renderable $1)
      throw new java.lang.RuntimeException("Field org.apache.tapestry.integration.app1.components.RenderableUser._renderable is read-only.");
      
      replace write _renderable: _write__renderable();
      
      extend method: public void beginRender(org.apache.tapestry.MarkupWriter $1, org.apache.tapestry.runtime.LifecycleEvent $2)
      {
       if ($2.isAborted()) return;
       render($1);
      }
      
      
      convert default constructor: initializer();
      
      add constructor: org.apache.tapestry.integration.app1.components.RenderableUser(org.apache.tapestry.internal.InternalComponentResources $1, org.apache.tapestry.services.Environment $2)
      {
       _$resources = $1;
       _$environment = $2;
       initializer();
      
      }
      
      ]
      


      Results in:
      java.lang.VerifyError: (class: org/apache/tapestry/integration/app1/components/RenderableUser, method: _$environment_read_renderable signature: ()Lorg/apache/tapestry/Renderable;) Inconsistent args_size for opc_invokeinterface
       at java.lang.Class.getDeclaredConstructors0(Native Method)
       at java.lang.Class.privateGetDeclaredConstructors(Class.java:2328)
       at java.lang.Class.getConstructors(Class.java:1446)
       at org.apache.tapestry.internal.services.ReflectiveInstantiator.findConstructor(ReflectiveInstantiator.java:60)
       at org.apache.tapestry.internal.services.ReflectiveInstantiator.<init>(ReflectiveInstantiator.java:48)
       at org.apache.tapestry.internal.services.InternalClassTransformationImpl.createInstantiator(InternalClassTransformationImpl.java:1043)
      


      Has anyone else had any luck using .class?

      I think, in my situation, I'll be able to work around this using the $type production.