不支持抽象类方法覆盖吗?
不支持抽象类方法覆盖吗?
不支持抽象类方法覆盖吗?
1***@qq.com
- 发布:2016-07-05 18:36
- 更新:2016-07-13 12:37
- 阅读:1245
5 个回复
1***@qq.com (作者)
不支持抽象类方法覆盖吗?
1***@qq.com (作者)
不支持抽象类方法覆盖吗?
Android_磊子
不支持。
1***@qq.com (作者)
有没有折中的方案, 目前做得一个项目,好几个地方用了原生的抽象类
2016-07-06 10:00
1***@qq.com (作者)
建议在SDK中集成字节码增强包 通过字节码增强可以实现类似需求
Android_磊子
字节码增强包 一个什么东东,有相关资料吗,谢不吝赐教。
2016-07-12 16:16
1***@qq.com (作者)
package te;
public abstract class TestAbs {
}
package te;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
public class MainTest {
}
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 (作者)
类似的字节码框架还有 ASM CGLIB
Android_磊子
多谢,研究之后才能有结论。
2016-07-14 17:14
1***@qq.com (作者)
回复 Android_磊子: 有新进展请告知一声,多谢啦 等你们好消息
2016-07-18 08:47
Android_磊子
回复 1***@qq.com:有新进展会发布到更新通知里。
2016-07-18 11:08