如何修剪Java程序

tua*_*uan 5 java aspectj variant pruning

让我从我想做的事情开始,然后提出一些问题.

我想开发一个通用的Java程序,它是许多程序的超集(让我们称之为程序变体).特别地,通用程序具有仅由一个或多个程序变体(但不是全部)使用的方法.给定一个特定的配置,我想删除不必要的方法,并为一个程序变量保留最小的方法集.

例如,我有一个通用程序如下:

public class GeneralProgram {

    // this method is common for all variants
    public void method1() {};

    // this method is specific to variant 1
    public void method2() {};

    // this method is specific to variant 2
    public void method3() {};
}
Run Code Online (Sandbox Code Playgroud)

然后在基于变体1的配置修剪程序之后,结果是

public class GeneralProgram {

    // this method is common for all variants
    public void method1() {};

    // this method is specific to variant 1
    public void method2() {};
}
Run Code Online (Sandbox Code Playgroud)

结果类名称是否与原始类名称相同无关紧要.我只想修剪课程内容.

所以,这是我的问题:

  1. 除了低级文本处理之外,您是否知道如何实现这一目标?

  2. 我知道我可以使用aspectJ在运行时禁用/启用特定方法,但我真正想要做的是在部署程序之前执行此任务.为此目的,Java中是否有任何技术?

Mar*_*iot 6

在我看来,这里正确的解决方案是使用一些面向对象的编程并将您的程序分层:

base.jar包含:

package foo.base;
class GeneralProgram {
   public void method1(){ }
}
Run Code Online (Sandbox Code Playgroud)

var1.jar包含:

package foo.var1;
import foo.base.GeneralProgram;
class GeneralProgramVar1 extends GeneralProgram {
   public void method2(){ }
}
Run Code Online (Sandbox Code Playgroud)

var2.jar包含:

package foo.var2;
import foo.base.GeneralProgram;
class GeneralProgramVar2 extends GeneralProgram {
   public void method3(){ }
}
Run Code Online (Sandbox Code Playgroud)

一些部署将同时具有base.jar和var1.jar,其他部署将具有base.jar和var2.jar.您将不得不使用类路径来解决依赖关系.


如果你可以很好地分离你的变种,以便有真正未使用的函数,那么你可以使用像ProGuard这样的压缩实用程序从类中删除未使用的方法.但是,您可能会发现,获得ProGuard优势所需的工作与我上面推荐的结构相同.