To print which class is calling a method??

Hello people
Is there any way it could be known which class is calling a particular method from the method itself?
Thanks

Try this:
* @author Malcolm McMahon
* @version $Revision: $
public class TestTrace {
    static {
        printCall();
    private static void c() {
        printCall();
    private static void printCall() {
        String name = Thread.currentThread().getStackTrace()[3].getMethodName();
        System.out.println("Call: " + name);
    public static void main(String[] args) {
        printCall();
        c();
}Only think is, I'm not confident that the index 3 will remain unchanged in different releases (there are two levels within getStackTrace() and there's no guarantee that will remain true).

Similar Messages

  • Errors in a Java class when calling other methods

    I am giving the code i have given the full class name . and now it is giving the following error :
    Cannot reference a non-static method connectDB() in a static context.
    I am also giving the code. Please do help me on this. i am a beginner in java.
    import java.sql.*;
    import java.util.*;
    import DButil.*;
    public class StudentManager {
    /** Creates a new instance of StudentManager */
    public StudentManager() {
    Connection conn = null;
    Statement cs = null;
    public Vector getStudent(){
    try{
    dbutil.connectDB();
    String Query = "Select St_Record, St_L_Name, St_F_Name, St_Major, St_Email_Address, St_SSN, Date, St_Company, St_Designation";
    cs = conn.createStatement();
    java.sql.ResultSet rs = cs.executeQuery(Query);
    Vector Studentvector = new Vector();
    while(rs.next()){
    Studentinfo Student = new Studentinfo();
    Student.setSt_Record(rs.getInt("St_Record"));
    Student.setSt_L_Name(rs.getString("St_L_Name"));
    Student.setSt_F_Name(rs.getString("St_F_Name"));
    Student.setSt_Major(rs.getString("St_Major"));
    Student.setSt_Email_Address(rs.getString("St_Email_Address"));
    Student.setSt_Company(rs.getString("St_Company"));
    Student.setSt_Designation(rs.getString("St_Designation"));
    Student.setDate(rs.getInt("Date"));
    Studentvector.add(Student);
    if( cs != null)
    cs.close();
    if( conn != null && !conn.isClosed())
    conn.close();
    return Studentvector;
    }catch(Exception ignore){
    return null;
    }finally {
    dbutil.closeDB();
    import java.sql.*;
    import java.util.*;
    public class dbutil {
    /** Creates a new instance of dbutil */
    public dbutil() {
    Connection conn;
    public void connectDB(){
    conn = ConnectionManager.getConnection();
    public void closeDB(){
    try{
    if(conn != null && !conn.isClosed())
    conn.close();
    }catch(Exception excep){
    The main error is occuring at the following lines connectDB() and closeDB() in the class student manager. The class dbutil is in an another package.with an another file called connectionManager which establishes the connection with DB. The dbutil has the openconnection and close connection methods. I have not yet written the insert statements in StudentManager. PLease do Help me

    You're doing quite a few things that will cause errors, I'm afraid. I'll see if I can help you.
    The error you're asking about is caused by the following line:
    dbutil.connectDB();
    Now first of all please always ensure that your class names begin with capital letters and your instances of classes with lowercase letters. That's what everybody does, so it makes your code much easier to follow.
    So re-write the couple of lines at the beginning of your dbutil class like this:
    public class Dbutil {
    /** Creates a new instance of Dbutil */
    public Dbutil() {
    Now you need to create an instance of dbutil before you can call connectDB() like this:
    Dbutil dbutil = new Dbutil();
    now you can call the method connectDB():
    dbutil.connectDB();
    The problem was that if you don't create an instance first then java assumes that you are calling a static method, because you don't need an instance of a class to call a static method. If it was static, the method code would have been:
    public static void connectDB(){
    You have a fine example of a static method call in your code:
    ConnectionManager.getConnection();
    If it wasn't a static method your code would have to look like this:
    ConnectionManager connectionManager = new ConnectionManager();
    connectionManager.getConnection();
    See the difference? I also know that ConnectionManager.getConnection() is a call to a static method because it begins with a capital letter.
    Anyway - now on to other things:
    You have got two different Connection objects called conn. One is in StudentManager and the other is in Dbutils, and for the moment they have nothing to do with each other.
    You call dbUtil.connectDb() and so if your connectDb method is working properly you have a live connection called conn in your dbUtil object. But the connection called conn in StudentManager is still null.
    If your connection in the dbUtil object is working then you could just add a line after the call to connectDb() in StudentManager so that the StudentManager.conn object references the dbUtil.conn object like this:
    dbutil.connectDB();
    conn = dbUtil.conn;

  • Using a string or char as a class when calling a method

    Is there a way to take the string.charAt(int) method and use it as a stand in for a class that is one character long? (Examples below, as I'm sure that question makes no sense out of context.)
    Something like (note the last line):
    import java.util.Scanner;
    public class DRV
         public static void main(String[] args)
              Scanner inpt = new Scanner(System.in);
              String stringy;
              A a = new A();
              System.out.println("Enter 'a': ");
              stringy = inpt.next();
              [stringy.charAt(0)].lineOne();
    }Or will I just have to use a lot of if statements:
    import java.util.Scanner;
    public class DRV
         public static void main(String[] args)
              Scanner inpt = new Scanner(System.in);
              String stringy;
              A a = new A();
              System.out.println("Enter 'a': ");
              stringy = inpt.next();
              if (stringy.charAt(0) == 'a')
                   a.lineOne();
                   System.out.println();
    }I doubt this is possible, but it would be totally awesome if there was something like [stringy.charAt(0)].classmethod();. This would allow me to just use a couple for loops instead of a cluster of if's.
    Thanks for any help.
    Edited by: 797223 on Sep 28, 2010 11:21 PM

    What Kayaman said.
    Another suggestion, slightly more elaborate, is to use class.forName() and reflection to create an instance of the correct class:
    stringy = inpt.next();
    Class clazz = Class.forName(makeClassCase(stringy));
    Object o = clazz.newInstance();
    SomeInterface i = (SomeInterface)o;
    i.lineOne();This assumes that you write a method private String makeClassCase(String s) that returns the correctly cased class name (e.g. transforms 'a' to 'A') and adds the appropriate package name if applicable, and that you define method lineOne() in an interface SomeInterface and in all classes that implement it (assuming I have correctly understood that all your classes do expose the same lineOne() method).
    You'll have to make special provisions for error cases (e.g. the user types a class name that doesn't exist, or that doesn't implement the common interface).

  • We are using extends thread and implements runnable which class first calli

    hi

    Yes, the language allows it, but your JSL quote is the 3rd edition, and Java 1.4 is based on the 2nd edition (the 2nd edition of the JSL does not go into such a deep explanation of the example shown, so thanks for that pointer). In any case, since the JSL does not address my specific issue, it is only superficially relevant (IMHO). The language allows it, but the behavior is unpredictable. I think that's what is sticking in my craw. I'm not sure what the behavior should be, but if I had to, I would propose that the behavior should not change when I change the inheritance qualifiers (again, in this particular case), but there may be other considerations.
    HibernateUtil is a snippet that can be found in the Hibernate tutorial/reference at [http://www.hibernate.org/hib_docs/v3/reference/en/html/tutorial.html|http://www.hibernate.org/hib_docs/v3/reference/en/html/tutorial.html]
    The basic idea is a cached session factory, because session factories are expensive to build. We use multiple databases, so our incarnation of HibernateUtil compares the requested database to the one in a static factory variable. If they match, that factory is used. If they don't match, the thread switches to the requested factory and creates sessions from it.
    The odd thing is that with the aforementioned inheritance "typo", it either detects that the requested database is the same as the one in the static factory (which is not true), or it returns the wrong factory (which is wrong). I want to emphasize that no other code changes were made (zero, zip, none, really, I mean it), and lots of other classes extend C1 (from the example) and they have never had this problem.

  • Telling which class called your method

    Does anybody know a way you can tell which class is calling your method? I mean:
    class A {
    public static void main(String args[]) {
    new A.doIt();
    void doIt() {
    B b = new B();
    b.callMe();
    class B {
    public void callMe() {
    String whoDidIt;
    whoDidIt=[stuff i'm asking for];
    System.out.println("I was called from an instance of class " + whoDidIt);
    How can I get that code to print "I was called from an instance of class A"???
    Lots of thanks in advance

    Pass the calling object to callMe as a parameter, egB b = new B();
    b.callMe(this);callMe becomes:
    public void callMe(Object caller)
       System.out.println("I was called from an instance of class " + caller.getClass());
    }Of course, there is nothing to stop anyone who calls the method passing a different object and confusing callMe.

  • How to load a class dynamically and then a call a method?

    Hi
    I want to call a method from a class,which class is loaded dynamically.
    Consider a classA and ClassB..
    ClassB contains a method showvalue() which returns a String value.
    I want to load a ClassB dynamically in ClassA,and call the method showvalue() and print the returned value of that method (showvalue).
    How to do this?
    Thanks

    Since you found your way to Reflections and Reference Objects, I can only assume you know that reflection is the answer. Since the reflection tutorial on this site, and indeed, the many others on the web, can explain this a whole lot better and more consisely than can be done in a forum, I'll point you in that direction instead. As a starting point, and to show I'm not just fobbing you off, you're interested in the classes java.lang.Class, java.lang.reflect.Method, and the method Class.getMethod(String, Class[])

  • Can't add list element when calling a method from another class

    I am trying to call a method in another class, which contains code listmodel.addElement("text"); to add an element into a list component made in that class.
    I've put in System.out.println("passed"); in the method just to make sure if the method was being called properly and it displays normally.
    I can change variables in the other class by calling the method with no problem. The only thing I can't do is get listmodel.addElement("text"); to add a new element in the list component by doing it this way.
    I've called that method within it's class and it added the element with no problem. Does Java have limitations about what kind of code it can run from other classes? And if that's the case I'd really like to know just why.

    There were no errors, just the element doesnt get added to the list by doing it this way
    class showpanel extends JPanel implements ActionListener, MouseMotionListener {
           framepanel fp = new framepanel();
           --omitted--
         public void actionPerformed(ActionEvent e){
                  if(e.getSource() == button1){
                       fp.addLayer();
    /*is in a different class file*/
    class framepanel extends JPanel implements ActionListener{
            --omitted--
         public void addLayer(){
              listmodel.addElement("Layer"+numLayer);
              numLayer++;
    }

  • Converting a string to Class object and calling its method

    I have recently moved to Java and I need help on this specific issue given below.
    I have to do this :
    ValModule1 val1 = new ValModule1();
    ValModule2 val2 = new ValModule2();
    if(val1.checkModule(xmlDocument)){
    $i++;
    There are many ValModule* classes and they all have the method called checkModule in them. I need to instantiate each class and run the checkMethod which returns true or false. My problem is that I am trying to get the name of the module (if it is ValModule1 or 2 or 3) from the user. What I get from the user is the name of the class for which I should call checkModule method on.
    how can I convert this string validationname given by the user and instantiate that class and call the method?
    I have tried this:
    String str="c:/xpathtest/src/Plugin_Config.xml";
    File xmlDocument = new File(str);
    String cls = "ValModule1"; // assuming this is what the user gave me
    Class t = Class.forName("ValModule1");
    Object o = t.newInstance();
    After that if I try
    if(o.checkModule(xmlDocument)){
    $i++;
    It gives me an error saying that it is not an existing method
    cannot resolve symbol
    [javac] symbol : method checkModule (java.io.File)
    [javac] location: class java.lang.Object
    [javac] if(o.checkModule(xmlDocument)){
    [javac] ^
    [javac] 1 error
    Can you please let me know where I am screwing up :-) ? If you need me to put both the programs I can do that too. Thanks in Anticipation

    I have recently moved to Java and I need help on this
    specific issue given below.
    I have to do this :
    ValModule1 val1 = new ValModule1();
    ValModule2 val2 = new ValModule2();
    if(val1.checkModule(xmlDocument)){
    $i++;
    There are many ValModule* classes and they all have
    the method called checkModule in them. I need to
    instantiate each class and run the checkMethod which
    returns true or false. My problem is that I am trying
    to get the name of the module (if it is ValModule1 or
    2 or 3) from the user. What I get from the user is
    the name of the class for which I should call
    checkModule method on.
    how can I convert this string validationname given by
    the user and instantiate that class and call the
    method?
    Define an interface containing the method all your classes have in common, cast the Object reference returned by newInstance to that interface, then you can call that method.
    Good Luck
    Lee

  • What class calls the method?

    If there is a method in a class that could be called by any one of, lets say, one hundred other classes, in that method is there a way of printing out the name of the class that called it ?
    So if class Xyz calls the method I would like to just do a println in the method saying that class Xyz called it ?

    Yup... Thread.currentThread().getStackTrace();
    package krc.utilz;
    import java.io.PrintStream;
    public class Tracer
      public static PrintStream out = null;
      public boolean enabled = true;
      public enum Format { LONG, SHORT }
      public Format format;
      public Tracer() {
        this(System.err, Tracer.Format.LONG);
      public Tracer(PrintStream out) {
        this(out, Tracer.Format.LONG);
      public Tracer(Format format) {
        this(System.err, format);
      public Tracer(PrintStream out, Format format) {
        this.out = out;
        this.format = format;
      public String toString() {
        return get(5);
      public String get() {
        return get(2);
      public String get(int i) {
        StackTraceElement[] st = Thread.currentThread().getStackTrace();
        if (i>=st.length) i = st.length-1; //don't go past top of stack
        StackTraceElement t = st;
    String s = t.getFileName()+":"+t.getLineNumber()+":";
    if (this.format == Format.LONG) {
    s += t.getClassName()+"."+t.getMethodName();
    return(s);
    public void debug(String msg) {
    if(!enabled)return;
    out.println("DEBUG: "+msg);
    public void print(String msg) {
    if(!enabled)return;
    if (out==null) return;
    out.println(get(3)+" : "+msg);
    public void print() {
    if(!enabled)return;
    if (out==null) return;
    out.println(get(3));
    public void print(int i) {
    if(!enabled)return;
    if (out==null) return;
    out.println(get(i));
    public static String getCurrentMethodName() {
    StackTraceElement[] st = Thread.currentThread().getStackTrace();
    return(st[2].getMethodName());

  • Get information for classes from call stack in abap (like java reflection)

    Hi,
    is there any possibilty to get following information:
    I want to program a logging tool. You can create a logging object and use some methods like
    xxxxx->add_msg(msg) to put logging information to the logging object.
    but i also want to find out, from which class/object/runtime environment this msg comes.
    example:
    class CL_ABC uses the logging tool and does following call:
    lo_logger = CL_logger->get_logger().
    lo_logger->add_msg( 'test the code' ).
    now the method ->add_msg() in logger object is called. inside this method, i want to have the information, from which class/object the ->add_msg() method is called. after the call, the logging object must have this information like:
    CALL_CLASS: CL_ABC
    CALL_LINE: 83
    MSG: test the code
    any ideas?

    You can use the SYSTEM_CALLSTACK function module.
    Read this thread, Uwe has given details on both getting the calling class and method: Re: How to determine current method / interface method that is running?
    Most probably this solves your needs.
    Regards

  • Using Java Reflection to call a method with int parameter

    Hi,
    Could someone please tell me how can i use the invoke() of the Method class to call an method wiht int parameter? The invoke() takes an array of Object, but I need to pass in an array of int.
    For example I have a setI(int i) in my class.
    Class[] INT_PARAMETER_TYPES = new Class[] {Integer.TYPE };
    Method method = targetClass.getMethod(methodName, INT_PARAMETER_TYPES);
    Object[] args = new Object[] {4}; // won't work, type mismatch
    int[] args = new int[] {4}; // won't work, type mismatch
    method.invoke(target, args);
    thanks for any help.

    Object[] args = new Object[] {4}; // won't work, type
    mismatchShould be:
        Object[] args = new Object[] { new Integer(4) };The relevant part of the JavaDoc for Method.invoke(): "If the corresponding formal parameter has a primitive type, an unwrapping conversion is attempted to convert the object value to a value of a primitive type. If this attempt fails, the invocation throws an IllegalArgumentException. "
    I suppose you could pass in any Number (eg, Double instead of Integer), but that's just speculation.

  • Conn Method Access - Calling from method

    Hi I am trying to create a method in another class to call another method that checks for userid in DB? What is the best way to set this up? I.e. calling method?
    //calling method below line
    private boolean setuserExist(String username) {
         else return false;
    public String getserExist() {
              return userexist;
    // Method being called below this line
    public boolean userExist(String username){
              boolean exist = false;
              System.out.println("in LoginDBAccess: username is " + username);
              try{
    Connection conn = dbc.getConnection();
    Statement statement = conn.createStatement();
    String query =      "SELECT User.UserID " +
                        "FROM User " +
                        "WHERE User.UserID = '" + username + "'";
    ResultSet resultSet = statement.executeQuery(query);
    System.out.println("1.1");
    ArrayList result = new ArrayList();
    while(resultSet.next()){
         //System.out.println("In While:");
    ArrayList item = new ArrayList();
    item.add(resultSet.getString("UserID"));
    result.add(item);
    System.out.println("LoginDBAccess Count: " + result.size());
    conn.close();
    if (result.size() == 1){
         exist = true;
              }catch(Exception e){
         e.printStackTrace();
              return exist;
         }

    http://forum.java.sun.com/thread.jspa?threadID=603496
    Cross-post.

  • Call Java Method on Commanlink action without page refresh

    Hi,
    I have a radio button in my application which on click calls a new JSP page inside DIV tag of the same JSP. Now before calling that JSP Page i want to perform some functionality . So i placed a commandlink on radio like this -
    <h:commandLink action="#{controller.deleteData}">
         <h:selectOneRadio id="licenseType" layout="lineDirection" value="#{controller.licenseType}" onclick="javascript:getServerInfo();">
                 <f:selectItem itemValue="#{dataTableItem}"/>
         </h:selectOneRadio>
    </h:commandLink> What I am looking for is that when a user clicks on Radio, first a Java method named deleteData() is called and then onclick() event of Radio is processed which loads a new JSP Page inside DIV tag beneath the radio button.
    But what happens is that as i click on Radio, command link takes precedence and refreshes the page.
    Is it possible for commanlink to just call the method and don't refresh or reload the page ????
    Plz assist with some code example

    Thanks Milind..... :-)
    I've not tried it as yet but i guess it would wok for radio.
    Is there any such event available for command link or command button too.... in which i just call the method on click and the page may not refresh ?
    Would "actionListener" event like this -
    <h:commandLink actionListener="#{controller.getsaveData}">call a java method and refresh the page or just call the method and leave the page as it is.
    If thats possible can u assist with some code examples ???
    USAGE :_ Actually I have a commandLink on which I have put a graphic Image "Submit" and on clicking of this image I just want the java method to be called but the page should not refresh or reload. Here is the code -
    <h:commandLink actionListener=" action="#{controller.getsaveData}">
                      <h:graphicImage url="/IMAGES/save_changes.JPG" height="27"
                                      width="136"/></h:commandLink>{code}
    Can u assist me with this Plz.{code}{code}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

  • Difference between calling static method and not static method?

    Hi,
    Suppose i want to write a util method, and many class might call this method. what is better? writing the method as static method or not static method. what is the difference. what is the advantace in what case?

    writing the method as static method or not static
    method. what is the difference.The difference is the one between static and non-static. Any tutorial or the JLs will clarify the difference, no need to repeat it here.
    what is the advantace in what case?It's usually not like you have much of a choice. If you need access to an instance's attributes, you can't make it static. Otherwise, make it static.

  • Is knowing of Class Name, which called current method, possible?

    Hallo everyone,
    My method is called from inside some method of some class. Can I know which class called my method.
    In other words I would like to know is that possible to have a name of class from which my current method is called? It's sometrhing like I need an access to the call stack.
    thanks!

    You can do the same thing before 1.4 as well:
          Throwable t;
          PrintStream ps;
          PrintWriter pw;
          String str;
          StringBuffer sb;
          StringWriter st;
          t = new Throwable();
          st = new StringWriter();
          pw = new PrintWriter(st);
          t.printStackTrace(pw);
          sb = st.getBuffer();
          str = sb.toString();You now have the stack as a String in the variable str.
    The problem is that you have to parse the String to separate methods from classes and so on. And different platform may produce slightly different string representations of the stack.
    So, it is easier in Java 1.4

Maybe you are looking for