2012-03-07 135 views
-2

在同一个包中有two classes A and B获取类名称函数的名称

如何获得由B类称为

限制类A的功能名称是A和B的代码不能被修改

+4

目前还不清楚问题是什么,请更新您的问题,以使您试图做得更清楚。也请张贴你已经尝试过的代码。 – 2012-03-07 04:51:40

+0

你想在运行时执行此操作吗?通过静态分析?到目前为止,你已经发布的这个标准并不是真正的问题。 – 2012-03-07 05:02:05

+0

@JimGarrison我想通过静态分析来做到这一点。 – Saurabh 2012-03-07 05:07:54

回答

1

反射可以是非常有用的,但如果你不明白它会非常复杂。

如果你有类的名称,并且要打印的方法:

Class c = Class.forName(the_class_name); 

for(Method m : c.getMethods()) { 
    System.out.println(m.toString()); 
} 

如果你想获得任何对象的类的名称:

String className = the_object.getClass().getName(); 

的组合两个可能看起来像这样:

for(Method m : the_object.getClass().getMethods()) 
    System.out.println(m.toString()); 

我想你所要求的是所有方法的名称从AB调用。

这不能真正做到反思,主要是因为Java没有提供任何方法来做到这一点。

The API一如既往提供更多信息。如果你通过那里看,你可能会想出一个简单的解决方法。

1

“A级或B级调用的所有函数的类”令人困惑。但是,如果您想将调用方的类和函数名称设置为A中描述的方法detectsName,那么下面的代码将对您有用。

public class A { 
    public void detectsName() { 
     Throwable t = new Throwable(); 
     StackTraceElement traceLine = t.getStackTrace()[1]; 
     // t.printStackTrace(); 
     String className = traceLine.getClassName(); 
     String methodName = traceLine.getMethodName(); 
     int lineNumber = traceLine.getLineNumber(); 
     System.out.println(className); 
     System.out.println(methodName); 
     System.out.println(lineNumber); 
    } 
} 

如果您从任何其他类这种方法说 - B,它会被检测到。

public class B { 
    public static void main(String[] args) { 
     A a = new A(); 
     a.detectsName(); 
    } 
} 
3

您不能使用Java反射来执行这样的静态代码分析任务。反射API不提供所需的信息。

关闭我的头顶,我能想到的,将工作两种方法:

  • 如果只有“.class”的文件,那么你可以使用一个字节码的库,例如BCEL到加载类并遍历它们以识别所有的方法调用。

  • 如果您有源代码,您还可以使用一些现有的Java分析器库为您的代码创建AST并分析它们。

(第一种方法可能是简单的,如果你想要的是类和方法名的列表。)

0

Dependency Finder这个可以做查询。它的方法是用XML生成元数据,然后使用基于正则表达式的比较。您可能正在专门寻找名为“封闭”的功能,并带有入站引用。