You are viewing a plain text version of this content. The canonical link for it is here.
Posted to bcel-user@jakarta.apache.org by jp...@free.fr on 2003/06/06 15:49:39 UTC
New instance of a modified class
How to obtain a new instance of a class which was modified by BCEL?
When I execute this code, a exception "java.lang.NoSuchFieldError" appears.
The goal of this code is to remove the field "libelle".
Have you an idea ?
thanks.
ClassGen clazz =new ClassGen(Repository.lookupClass(GenerateurVapeur.class));
// Get the field "libelle".
Field prpReelle = clazz.containsField("libelle");
// Remove the field.
if(prpReelle!=null)
clazz.removeField(prpReelle);
JavaClass classeJava = clazz.getJavaClass();
try{
// Save the class
dumpClass(classeJava,GenerateurVapeur.class);
org.apache.bcel.util.ClassLoader cl = new
org.apache.bcel.util.ClassLoader(ClassLoader.getSystemClassLoader());
Class newClass = cl.loadClass(GenerateurVapeur.class.getName());
// Try to get a new instance of "GenerateurVapeur"
GenerateurVapeur newInstance = (GenerateurVapeur)newClass.newInstance();
}catch(Exception exp){
exp.printStackTrace();
}
---------------------------------------------------------------------
To unsubscribe, e-mail: bcel-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: bcel-user-help@jakarta.apache.org
Re: New instance of a modified class
Posted by Stephen Kolaroff <ch...@riflexo.com>.
Hi
Unfortunately, you have to override some methods of BCEL's class loader
to get actually class instrumentation/generation on the fly. Even so,
because of the JLS (or JVM spec, I am not sure right now), you can not
have different byte code for classes with same name loaded with the same
class loader. I am affraid, beacuse of this you can never execute:
GenerateurVapeur newInstance = (GenerateurVapeur)newClass.newInstance();
in your code without ClassCastException (newClass' instances will be
thought as different, unassignable to GenerateurVapeur; GenerateurVapeur
already loaded by your context classloader several lines above). I must
confess, I have never tried this, so if you have success, pls, inform me.
What I am doing when have to do what you want:
1. Obtain JavaClass from a repository without using any Class-es, just
String names.
2. Mess with the class, and make it implement a useful interface.
3. Dump the class into a fake classloader or even on the disk.
4. Load the class and typecast to the useful interface
5. enjoy
jpicard@free.fr wrote:
>How to obtain a new instance of a class which was modified by BCEL?
>
>When I execute this code, a exception "java.lang.NoSuchFieldError" appears.
>
>The goal of this code is to remove the field "libelle".
>
>Have you an idea ?
>
>thanks.
>
>
> ClassGen clazz =new ClassGen(Repository.lookupClass(GenerateurVapeur.class));
>
> // Get the field "libelle".
> Field prpReelle = clazz.containsField("libelle");
>
> // Remove the field.
> if(prpReelle!=null)
> clazz.removeField(prpReelle);
>
> JavaClass classeJava = clazz.getJavaClass();
>
> try{
>
> // Save the class
> dumpClass(classeJava,GenerateurVapeur.class);
>
> org.apache.bcel.util.ClassLoader cl = new
>org.apache.bcel.util.ClassLoader(ClassLoader.getSystemClassLoader());
>
> Class newClass = cl.loadClass(GenerateurVapeur.class.getName());
>
> // Try to get a new instance of "GenerateurVapeur"
> GenerateurVapeur newInstance = (GenerateurVapeur)newClass.newInstance();
>
> }catch(Exception exp){
> exp.printStackTrace();
> }
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: bcel-user-unsubscribe@jakarta.apache.org
>For additional commands, e-mail: bcel-user-help@jakarta.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: bcel-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: bcel-user-help@jakarta.apache.org