{"id":195,"date":"2008-01-08T22:24:21","date_gmt":"2008-01-08T22:24:21","guid":{"rendered":"https:\/\/kari.world.ikari.fi\/2008\/01\/08\/detecting-from-where-code-is-called\/"},"modified":"2008-01-08T22:24:21","modified_gmt":"2008-01-08T22:24:21","slug":"detecting-from-where-code-is-called","status":"publish","type":"post","link":"https:\/\/kari.world.ikari.fi\/?p=195","title":{"rendered":"Detecting from where code is called"},"content":{"rendered":"<p>Detect if current piece of code is called by own classes:<br \/>\n<br \/>\n[code lang=&#8221;java&#8221;]<br \/>\n\/**<br \/>\n * @return True if current execution points originates from own classes<br \/>\n *\/<br \/>\npublic static boolean isOwn() {<br \/>\n    StackTraceElement[] stack = Thread.currentThread().getStackTrace();<\/p>\n<p>    int len = stack.length;<br \/>\n    for (int i = 2; i < len; i++) {\n        if (stack[i].getClassName().startsWith(\"org.kari.\")) {\n            return true;\n        }\n    }\n\n    return false;\n}\n[\/code]\n\n\n\n<p>Detect if StringBuilder is called by own classes:<br \/>\n<br \/>\n[code lang=&#8221;java&#8221;]<br \/>\n\/**<br \/>\n * @return true if StringBuilder is directly called by own class<br \/>\n *\/<br \/>\npublic static boolean isImmediateOwn() {<br \/>\n    StackTraceElement[] stack = Thread.currentThread().getStackTrace();<\/p>\n<p>    int index = 2;<br \/>\n    int len = stack.length;<\/p>\n<p>    for (; index < len; index++) {\n        String className = stack[index].getClassName();\n        if (className.startsWith(\"org.kari.\")) {\n            return true;\n        }\n        if (!(className.equals(\"java.lang.AbstractStringBuilder\")\n            || className.equals(\"java.lang.StringBuilder\")) )\n        {\n            return false;\n        }\n    }\n\n    return false;\n}\n[\/code]\n\n\n\n<p>And now actual utilitization in Eclipse.<\/p>\n<ol>\n<li>Open AbstractStringBuilder -class<\/li>\n<li>Add breakpoint into beginning of expandCapacity() -method<\/li>\n<li>Paste following code as breakpoint condition:<br \/>\n[code lang=&#8221;java&#8221;]<br \/>\nStackTraceElement[] stack = Thread.currentThread().getStackTrace();<\/p>\n<p>int index = 2;<br \/>\nint len = stack.length;<\/p>\n<p>for (; index < len; index++) {\n    String className = stack[index].getClassName();\n    if (className.startsWith(\"org.kari.\")) {\n        return true;\n    }\n    if (!(className.equals(\"java.lang.AbstractStringBuilder\")\n        || className.equals(\"java.lang.StringBuilder\")) )\n    {\n        return false;\n    }\n}\nreturn false;\n[\/code]\n<\/li>\n<\/ol>\n<p>Now Eclipse will hit the breakpoint whenever StringBuilder is expanded as a direct call from application logic. So what is the point of this exercise. Answer is the curiosity of analyzing how much String trashing application logic is performing.<\/p>\n<p>Sadly just calling directly org.kari.util.ClassUtil.isImmediateOwn()from breakpoint does not work, but logic must be copy-pasted into breakpoint condition.<\/p>\n<p>However, since we want to simplify debugging, and simply write this:<br \/>\n[code lang=&#8221;java&#8221;]<br \/>\norg.kari.util.ClassUtil.isImmediateOwn()<br \/>\n[\/code]<\/p>\n<p>Reason why it doesn&#8217;t work is that when break point is placed into some class coming from &#8221;bootclasspath&#8221;, java class loading mechanism prevents access into this rogue &#8221;org.kari.util.ClassUtil&#8221; -class. However, problem can be worked around by adjusting bootstrap class path:<\/p>\n<ol>\n<li>Create new folder into project, named &#8221;bootclasses&#8221;<\/li>\n<li>Take: Run -&gt; Open Debug Dialog&#8230;<\/li>\n<li>Select &#8221;Classpath&#8221; -tab<\/li>\n<li>Select &#8221;Bootstrap entries&#8221;<\/li>\n<li>Select &#8221;Advanced&#8230;&#8221;<\/li>\n<li>Select &#8221;Add Folders&#8221;<\/li>\n<li>Select &#8221;Project\/bootclasses&#8221;<\/li>\n<li>Go into command line, and copy org.kari.util.ClassUtil from Project\/bin into Project\/bootclasses<\/li>\n<\/ol>\n<p>After this <b>org.kari.util.ClassUtil.isImmediateOwn()<\/b> will work as breakpoint for system classes.<\/p>\n<p>And our final breakpoint condition is then<br \/>\n[code lang=&#8221;java&#8221;]<br \/>\narg0 > 50 &#038;&#038; org.kari.util.ClassUtil.isImmediateOwn()<br \/>\n[\/code]<\/p>\n<p>Note &#8221;arg0&#8221; must be used to refer &#8221;minimumCapacity&#8221; argument of expandCapacity() -method.<\/p>\n<p>PS. Simple breakpoint without condition in expandCapasity() -method, shows that AWT\/Swing are doing lots of reduntant String trashing internally.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Detect if current piece of code is called by own classes: [code lang=&#8221;java&#8221;] \/** * @return True if current execution points originates from own classes *\/ public static boolean isOwn() { StackTraceElement[] stack = Thread.currentThread().getStackTrace(); int len = stack.length; for (int i = 2; i < len; i++) { if (stack[i].getClassName().startsWith(\"org.kari.\")) { return true; }...\n<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-195","post","type-post","status-publish","format-standard","hentry","category-java"],"_links":{"self":[{"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=\/wp\/v2\/posts\/195","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=195"}],"version-history":[{"count":0,"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=\/wp\/v2\/posts\/195\/revisions"}],"wp:attachment":[{"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=195"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=195"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=195"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}