Comments (3)
Hi,
Once you execute CtClass#writeFile(), then the class get frozen because you've already written it out and there is no way to modify that class if the class is loaded onto the JVM.
You can get a CtClass object back to be modifiable again by:
cc.stopPruning(true); // don't delete the data if it is written out.
:
cc.writeFile();
cc.defrost(); // now modifiable again
Another approach is to use debugWriteFile() instead of writeFile().
debugWriteFile() keeps a CtClass object modifiable after it is written out.
You don't have to call #stopPruning() or #defrost().
from javassist.
Hello,
Thanks for responding.
My very first attempt to modify the class is just after the isFrozen method call. So I am not calling writeFile if you check the sample I've provided.
Let me provide some comments on the steps, code is messy I know.
CtClass cc;
try {
cc = classPool.get (className); // just getting the class
getLog().info("Class: " + cc.getSimpleName() + " is frozen ? : " + cc.isFrozen()); // checking if its frozen
} catch (NotFoundException e) {
e.printStackTrace ();
continue;
}
if (cc.isAnnotation () // skipping interfaces and annotations
|| cc.isInterface ())
continue;
CtMethod[] methods = cc.getDeclaredMethods (); // getting methods
for (CtMethod ctMethod : methods) {
try {
ctMethod.addLocalVariable ("executionStarted", CtClass.longType); // Class is frozen exception is thrown right away !
ctMethod.insertBefore ("executionStarted = System.currentTimeMillis ();");
ctMethod.insertAfter ("{final long executionFinished = System.currentTimeMillis ();"
+ "System.out.println(\"Execution in ms: \" + (executionFinished-executionStarted));}");
cc.writeFile ("."); // The very first time of writeFile method in the whole project
} catch (Throwable e) {
getLog ().error ("Error on class: "
+ cc.getName ()
+ " for method: "
+ ctMethod.getName ());
getLog ().error (e);
}
}
I event tried calling defrost () before trying anything on the class but no good.
EDIT:
I think I overlooked one case and now I can make sense of the situation.
While iterating over methods I couldn't observe at least one successful iteration without exception thrown, according to your response there has to be at least one good iteration and consequents should all fail.
Maybe getDeclaredMethods returns also the default constructor and I missed it within debugs? I'll check and update here.
Thanks
from javassist.
Yes, I missed the successful first one while iterating over the methods of the class, simply moving out the cc.writeFile call to the outer loop did the trick.
Thanks again for your response
Cheers
from javassist.
Related Issues (20)
- How to get all annotations declared on a class
- org.springframework.transaction.annotation.Transactional
- "NEW followed by no DUP was found" check is probably not necessary
- Exception: java.lang.reflect.InaccessibleObjectException: Unable to make protected
- java.lang.ClassFormatError: Truncated class file HOT 1
- Add contributing and other community docs to javassist
- HotSwapper Cannot be used multiple times
- Triple Licensing HOT 3
- feature request: support for adding Annotations to dynamic Proxies
- How want insert Runnable HOT 1
- Complete example.md
- In Java21, the ConstPool API throws NPE for MethodParameters attributes without parameter names
- NPE of javassist.bytecode.stackmap.TypeData HOT 1
- Can I restore a line bytecode after transformed?
- Bad OSGi metadata in https://repo1.maven.org/maven2/org/javassist/javassist/3.30.0-GA HOT 9
- License condition HOT 4
- Replacing a method call to a private static function of an outer class from within an inner class leads to NoSuchMethodError
- javassist creates invalid class files for Java records when injecting static fields and adding static initializer code
- Request for posting of Maven signing key(s) HOT 2
- Asking about licenses issue HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from javassist.