[jboss-user] [Javassist user questions] - CannotCompileException / IllegalAccessException with multipl

roger_graham do-not-reply at jboss.com
Mon Aug 14 06:34:46 EDT 2006


Hello,

I am desperate for help and really hope you can help me.  I have two value objects and I want to somehow instrument the code to allow certain methods to be instrumented to write logging into a log file (we are using WSAD and the debugger does not work :-().

If I execute this:

		// get (shared) class pool
  | 		ClassPool pool= ClassPool.getDefault();
  | 		
  | 		// change code for MyTestVO				
  | 		CtClass clazz1 = pool.get("com.test.MyTestVO");
  | 		CtMethod method1 = clazz1.getDeclaredMethod("getValue");
  | 		method1.insertBefore("System.out.println(\"--- Call to method! ---\");");
  | 		pool.toClass( clazz1 );	
  | 		
  | 		// invoke method
  | 		MyTestVO vo = new MyTestVO("Some value");
  | 		vo.getValue();
all is fine.  However, when I try to execute another modification as this (immediately after):

		// change code for MyOtherTestVO
  | 		CtClass clazz2 = pool.get("com.test.MyOtherTestVO");
  | 		CtMethod method2 = clazz2.getDeclaredMethod("getSomeOtherProperty");
  | 		method2.insertBefore("System.out.println(\"--- Call to the other method! ---\");");
  | 		pool.toClass( clazz2 );
  | 		
  | 		MyOtherTestVO otherVO = new MyOtherTestVO("some other value");
  | 		otherVO.getSomeOtherProperty();
I get this stack trace:

anonymous wrote : --- Call to method! ---
  | getValue method body
  | Exception in thread "main" javassist.CannotCompileException: by java.lang.IllegalAccessException: java/lang/ClassLoader
  | 	at javassist.ClassPool.toClass(ClassPool.java:834)
  | 	at javassist.ClassPool.toClass(ClassPool.java:769)
  | 	at com.test.QuickTest.main(QuickTest.java:28)
  | Caused by: java.lang.IllegalAccessException: java/lang/ClassLoader
  | 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  | 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
  | 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:41)
  | 	at java.lang.reflect.Method.invoke(Method.java:386)
  | 	at javassist.ClassPool.toClass(ClassPool.java:823)
  | 	... 2 more
an anyone please explain what is going on?  It is to do with when the CtPool class attempts to reinvoke the findClass via reflection.


Thanks in advance,
Roger




For your info I have included the full sources beneath (but above should be sufficient I think):

com.test.QuickTest

package com.test;
  | 
  | import javassist.CannotCompileException;
  | import javassist.ClassPool;
  | import javassist.CtClass;
  | import javassist.CtMethod;
  | import javassist.NotFoundException;
  | 
  | public class QuickTest {
  | 	public static void main(String[] args) throws NotFoundException, CannotCompileException {
  | 		// get (shared) class pool
  | 		ClassPool pool= ClassPool.getDefault();
  | 		
  | 		// change code for MyTestVO				
  | 		CtClass clazz1 = pool.get("com.test.MyTestVO");
  | 		CtMethod method1 = clazz1.getDeclaredMethod("getValue");
  | 		method1.insertBefore("System.out.println(\"--- Call to method! ---\");");
  | 		pool.toClass( clazz1 );	
  | 		
  | 		// invoke method
  | 		MyTestVO vo = new MyTestVO("Some value");
  | 		vo.getValue();
  | 		
  | 		// change code for MyOtherTestVO
  | 		CtClass clazz2 = pool.get("com.test.MyOtherTestVO");
  | 		CtMethod method2 = clazz2.getDeclaredMethod("getSomeOtherProperty");
  | 		method2.insertBefore("System.out.println(\"--- Call to the other method! ---\");");
  | 		pool.toClass( clazz2 );
  | 		
  | 		MyOtherTestVO otherVO = new MyOtherTestVO("some other value");
  | 		otherVO.getSomeOtherProperty();
  | 	}	
  | }

com.test.MyTestVO

package com.test;
  | 
  | public class MyTestVO {
  | 	private String value;
  | 	
  | 	MyTestVO(String value) {
  | 		this.value = value;
  | 	}
  | 
  | 	public String getValue() {		
  | 		System.out.println("getValue method body");
  | 		return value;
  | 	}
  | }

com.test.MyOtherTestVO

package com.test;
  | 
  | public class MyOtherTestVO {
  | 	private String someOtherProperty;
  | 	
  | 	MyOtherTestVO(String value) {
  | 		this.someOtherProperty = value;
  | 	}
  | 
  | 	public String getSomeOtherProperty() {
  | 		System.out.println("getSomeOtherProperty method body");
  | 		return someOtherProperty;
  | 	}
  | 	
  | 	
  | }



View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3964927#3964927

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3964927



More information about the jboss-user mailing list