1***@qq.com
1***@qq.com
  • 发布:2016-07-05 18:36
  • 更新:2016-07-13 12:37
  • 阅读:1125

不支持抽象类方法覆盖吗?

分类:Native.js

不支持抽象类方法覆盖吗?
不支持抽象类方法覆盖吗?
不支持抽象类方法覆盖吗?

2016-07-05 18:36 负责人:无 分享
已邀请:
1***@qq.com

1***@qq.com (作者)

不支持抽象类方法覆盖吗?

1***@qq.com

1***@qq.com (作者)

不支持抽象类方法覆盖吗?

Android_磊子

Android_磊子

不支持。

  • 1***@qq.com (作者)

    有没有折中的方案, 目前做得一个项目,好几个地方用了原生的抽象类

    2016-07-06 10:00

1***@qq.com

1***@qq.com (作者)

建议在SDK中集成字节码增强包 通过字节码增强可以实现类似需求

  • Android_磊子

    字节码增强包 一个什么东东,有相关资料吗,谢不吝赐教。

    2016-07-12 16:16

  • 1***@qq.com (作者)

    package te;


    public abstract class TestAbs {


    public void print(){  
    System.out.println("TestAbs");
    }

    }


    package te;


    import javassist.ClassPool;

    import javassist.CtClass;

    import javassist.CtMethod;

    import javassist.CtNewMethod;


    public class MainTest {


    public static void printTest(TestAbs abs) {  
    abs.print();
    }

    public static <V> void main(String[] args) throws Exception {
    if (true) {
    ClassPool pool = ClassPool.getDefault();
    // 动态生成类
    CtClass cls = pool.makeClass("JavassistTest");

    // 设置父类
    cls.setSuperclass(pool.getCtClass("te.TestAbs"));

    // 重写print方法
    CtMethod make = CtNewMethod.make("public void print() { }", cls);
    make.setBody("{System.out.print(\"Override\");}");
    cls.addMethod(make);
    cls.writeFile();

    // 创建动态类实例
    Object o = cls.toClass().newInstance();
    // 测试输出
    printTest((TestAbs) o);

    }
    }

    }

    2016-07-13 12:34

  • 1***@qq.com (作者)

    这个是通过javassist 生成动态类并重写抽象类方法

    2016-07-13 12:35

  • 1***@qq.com (作者)

    回复 Android_磊子: package te;


    public abstract class TestAbs {


    public void print(){

    System.out.println("TestAbs");

    }


    }


    package te;


    import javassist.ClassPool;

    import javassist.CtClass;

    import javassist.CtMethod;

    import javassist.CtNewMethod;


    public class MainTest {


    public static void printTest(TestAbs abs) {

    abs.print();

    }


    public static <V> void main(String[] args) throws Exception {

    if (true) {

    ClassPool pool = ClassPool.getDefault();

    // 动态生成类

    CtClass cls = pool.makeClass("JavassistTest");


    // 设置父类

    cls.setSuperclass(pool.getCtClass("te.TestAbs"));


    // 重写print方法

    CtMethod make = CtNewMethod.make("public void print() { }", cls);

    make.setBody("{System.out.print(\"Override\");}");

    cls.addMethod(make);

    cls.writeFile();


    // 创建动态类实例

    Object o = cls.toClass().newInstance();

    // 测试输出

    printTest((TestAbs) o);


    }

    }

    }

    2016-07-13 12:38

1***@qq.com

1***@qq.com (作者)

类似的字节码框架还有 ASM CGLIB

该问题目前已经被锁定, 无法添加新回复