如何确定Java程序中对外部类和方法的声明和引用?

时间:2018-08-13 21:15:24

标签: java software-design

假设我有两个包(package1,package2),每个包(package1.A,package2.B)中都有一个类。我需要使用Java程序标识从package1.A到package2.B的引用,反之亦然,还需要引用每个类中的任何方法。

代码将如下所示:

package package1;
public class A{
    public  A(){
        Class<?> clazz = Class.forName("package2.B");
        Method mthd = clazz.getMethod("someMethod", Integer.TYPE);
}
    public static void main(String[] args) {
        new A(); 
    }

B类是这样的:

package package2;
    public class B {
        public B someMethod(int someParam) {
            return null;
        }
    }

我只需要一些关于如何开始使用解析器解决此问题的指示。我必须牢记什么样的规则?我的问题的目的是确定依赖性。

1 个答案:

答案 0 :(得分:0)

我不打算发布此消息,因为它不是很好,但是由于已经过了几天,并且您没有得到太多答复,因此根据您的评论,这是另一种答案:

  

我正在尝试查找两个类及其之间的依赖关系   各种方法。

如果您只需要查找依赖项并在自己的应用程序中调用(不是外部库),则继续阅读。

考虑将一两行代码注入到每个方法中(由脚本在编译时轻松完成?),并记录此信息。例如,您可以使用object.getClass().???的变体来查找有关当前方法的信息,包括其程序包,类和方法名称。

例如,此示例仅将信息直接输出到控制台:

StackTraceElement[] ste = Thread.currentThread().getStackTrace();
System.out.println("Called by: "+ste[ste.length - 2].getMethodName());
Object object = new Object(){};
System.out.println("Method details: "+ object.getClass().getPackage().getName() +" - "+ object.getClass().getName() +" - "+ object.getClass().getEnclosingMethod().getName());

对于插入这些行的每种方法,每次调用它时都会在控制台上吐出类似这样的内容:

Called by: source
Method details: myPackage - myClass$1 - myMethod

通过将以上内容分为几个类,对我的一个应用程序进行了快速测试,得出了一些真实结果:

Called by: getStackTrace
Method details: testdump - testdump.TestDump$1 - main
Called by: pumpEvents
Method details: testdump - testdump.Rect$1 - paintComponent
Called by: checkFileSize
Method details: update - update.FTP$2 - checkFileSize
Called by: checkFileSize
Method details: update - update.FTP$1 - download
Called by: pumpEvents
Method details: testdump - testdump.Rect$1 - paintComponent
...

我们可以很容易地准确地看到被调用的两个不同的包,并且我们通常可以看到从何处调用了它,尽管您将需要使用ste[ste.length - 2].getMethodName()来返回不同的行,具体取决于回溯的距离在您要查看的堆栈跟踪上。显然,这仅应在调试模式下使用,并且会产生大量垃圾,但是根据应用程序的大小,手动检查或通过构建一个简短的程序来检查输出结果应该很简单一棵依赖树供您检查。


或者,您也可以通过类似的方式使用Java 9堆栈行走API:https://stackoverflow.com/a/45812871/1270000