在android中添加存在类的方法

R4j*_*R4j 6 java android design-patterns

我正在寻找一种方法将一些方法添加到存在的类中,如下所示:

String s = "";
s.doSomething();
Run Code Online (Sandbox Code Playgroud)

在目标C中,我可以使用类别来执行此操作.

@interface NSString( Stuff)
-(void)doSomething();
@end
Run Code Online (Sandbox Code Playgroud)

android有这样的东西吗?还是另一个黑客?


更新:实际上,我遇到了这个问题:我从jar文件中使用了一个类(不是final)(所以,我无法触及它的源代码).然后我想在不使用继承的情况下将方法(或类似的东西)添加到这个类中.例如:

 public class Provider{
       // many methods and fields go here...
       public String getName(){}
 }
Run Code Online (Sandbox Code Playgroud)

我想做的就是:

 provider.print(); //that call getName() method;
Run Code Online (Sandbox Code Playgroud)

我也试过代理模式,它有效,但我不喜欢这种方式(因为它像一个包装类,我必须存储一个具有许多字段和方法的对象,使用一个方法):

 public class ProxyProvider{
       Provider provider;
       public ProxyProvider(Provider provider){
           this.provider = provider;
       }
       public void print(){
           String name = provider.getName();
           //do something
       }
 }
Run Code Online (Sandbox Code Playgroud)

有什么方法可以解决这个问题吗?

ass*_*ias 4

您可以使用静态方法创建一个实用程序类:

public final class ProviderUtils {

    private ProviderUtils() {} // not instantiable, it is a utility class

    public static void print(Provider provider) {
        String name = provider.getName();
        // print the name
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的代码中,您可以调用它:

Provider p = new Provider(...);
ProviderUtils.print(p);
Run Code Online (Sandbox Code Playgroud)

如果该类只有一个print方法,您也许可以调用它ProviderPrinter而不是ProviderUtils.

最后你不会有成千上万的可能性 - 你可以:

  • 扩展类以及子类中您需要的任何方法=>您说您不想要那个
  • 修改类的源代码并重新编译您自己的jar版本
  • 将类包装在添加您需要的方法的包装器中(您的 ProxyProvider 示例)
  • 将您需要的方法放在静态实用程序类中(我上面建议的)
  • 在运行时修改类并添加方法,但这是一个复杂的路径,因为您需要使用类加载器。