[jboss-dev-forums] [Javassist development Forum] - CannotCompileExceptio-[source error]: no such class

leooon do-not-reply at jboss.com
Wed Jan 21 07:23:08 EST 2009


Hi, I am getting 'CannotCompileExceptio-[source error]: no such class: MyAlert' error while making a reference to an static Inner class name 'MyAlert'.



*********below is my code***********
	public void addCodeToStartup(String strClass, String classpath){		
		System.out.println("\tupdating '"+strClass.trim()+"' located at '"+classpath+"' ...");
		String cp2 = "";
		try{
			cp2 = classpath.substring(0, classpath.lastIndexOf('\\'));
			System.out.println("\tcp2 '"+cp2);
		
		//String pkg = "";
		
			//pkg = strClass.substring(0, strClass.lastIndexOf('.'));
		}catch(StringIndexOutOfBoundsException siobe){
			System.out.println("StringIndexOutOfBoundsException: "+siobe.getMessage());
		}
		//System.out.println("\tpkg '"+pkg+"'");
		
		try	{
			ClassPool cp = ClassPool.getDefault();

			cp.insertClassPath(".");
			cp.insertClassPath(cp2+'\\');
			cp.insertClassPath(classpath+'\\');
		
			cp.importPackage("javax.microedition.lcdui");
			cp.importPackage("javax.microedition.midlet");
			cp.importPackage("javax.microedition.rms");
		
			////////////////////////////////////////////////////////////////////////
			CtClass cc = cp.get(strClass.trim());
			
			CtClass anInterface = cp.get("javax.microedition.lcdui.CommandListener");
			CtClass aSuperClass = cp.get("javax.microedition.lcdui.Alert");
			
			CtClass aUiClass = cc.makeNestedClass("MyAlert", true);			
			System.out.println("\t1");
			aUiClass.setSuperclass(aSuperClass);
			aUiClass.addInterface(anInterface);
			System.out.println("\t2");
			CtField f = CtField.make("Command cmdOk;", aUiClass);
			aUiClass.addField(f);
			System.out.println("\t3");
			f = CtField.make("static MIDlet midlet1;", aUiClass);
			aUiClass.addField(f);
			System.out.println("\t4");
			CtConstructor c = CtNewConstructor.make(
					"MyAlert(MIDlet midlet, String info)	{"
					+"\n	super(\"Warning\", info, null, AlertType.WARNING);"		
					+"\n	midlet1 = midlet;"
					+"\n	cmdOk = new Command(\"OK\", Command.EXIT, 1);"
					+"\n	addCommand(cmdOk);"
					+"\n	setCommandListener(this);"
					+"\n	}",
					aUiClass);			
			aUiClass.addConstructor(c);
			System.out.println("\t5");
			CtMethod m = CtMethod.make(
					"public void commandAction( Command cmd, Displayable displayable){"						
						+"\n\nif (cmd == cmdOk){"
						+"\n	midlet1.notifyDestroyed();"
						+"\n}"
					+"\n}", 
					aUiClass);
			aUiClass.addMethod(m);
			System.out.println("\t6");
			m = CtMethod.make(
					"static MyAlert getMyAlert(MIDlet newMIDlet, String s){"
					+"\nreturn new MyAlert(newMIDlet, s);"
					+"\n}",					
					aUiClass
					);			
			aUiClass.addMethod(m);
			System.out.println("\t7");
			aUiClass.writeFile();
			System.out.println("\tMyAlert class created!");
			
			
			String dest = classpath +'\\'+ aUiClass.getName();
			dest = dest.replace('.', '\\');
			dest += ".class";
			
			String newClass = aUiClass.getName();
			newClass  = newClass.replace('.', '\\')+".class";
			System.out.println("\tnewClass: "+newClass);
			System.out.println("\tdest: "+dest);
			
			File file = null, destFile = null;
			file = new File(newClass);
			//destFile = new File(dest);
			//file.renameTo(destFile);
			
			//if (file.delete())
				//System.out.println("\tfile succefull renames and copy is deleted!");
			
		
			////////////////////////////////////////////////////////////////////////
			//						MIDlet TO BE MODIFIED						  //	
			////////////////////////////////////////////////////////////////////////
			m = cc.getDeclaredMethod("startApp");
			System.out.println("\t1");
			
			//ADD YOUR startUp code here
			m.insertBefore(
				"{"
				+"\n\n 	boolean flag=true;"
				+"\n   	byte[] kb=null;"

				+"\n\n	try	{"
				+"\n		RecordStore settings = RecordStore.openRecordStore(\"Demo\", true);"
				+"\n		if (settings.getNumRecords() <= 0)	{"
				+"\n			//startTime = System.currentTimeMillis();"
				+"\n			kb=Long.toString(System.currentTimeMillis()).getBytes();"
				+"\n			settings.addRecord(kb,0,kb.length);// time in millis"
				+"\n			byte[] counter={0};"
				+"\n			settings.addRecord(counter,0,1);  // counter"
				+"\n			flag= true;"
				+"\n		}"
    
				+"\n\n		kb=settings.getRecord(2);"
				+"\n		kb[0]=(byte)(kb[0]+1);"
				+"\n		System.out.println(\"value of counter \" + kb[0]);"
				+"\n		settings.setRecord(2,kb,0,1);"

				+"\n\n		if(settings.getRecord(2)[0]>2)	{"
				+"\n			flag=false;"
				+"\n		}"

				+"\n\n		settings.closeRecordStore();"

				+"\n	}catch(Exception e)	{"
				+"\n		e.printStackTrace();"
				+"\n		flag=false;"
				+"\n	}"					
				+"\n	if(!flag)	"				
				+"\n 		Display.getDisplay(this).setCurrent(MyAlert.getMyAlert(this, \"Your MIDlet expired, download again\"));"		
				+"\n	else"
				+"\n 		Display.getDisplay(this).setCurrent(MyAlert.getMyAlert(this, \"Still Valid!\"));"
				+"\n	"
				+"}"				
				);
			System.out.println("\tmethod created");
			
			cc.writeFile();
			
			System.out.println("\tYessssss");
			
		}catch (NotFoundException nfe) {			
			System.out.println("\tNotFoundException: "+nfe.getMessage());
		}catch (CannotCompileException cce) {
			System.out.println("\tCannotCompileException: "+cce.getMessage());
			System.out.println(cce.getReason());
			System.out.println(cce.getCause());
		}catch (IOException ioe) {
			System.out.println("\tIOException: "+ioe.getMessage());
		}
	}
**********************************





Any sample example how to inject a static InnerClass is appreciated.

Best Regards
Mukesh

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

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



More information about the jboss-dev-forums mailing list