没有合适的资源?快使用搜索试试~ 我知道了~
首页Java实例化一个抽象类对象的方法教程
Java实例化一个抽象类对象的方法教程
995 浏览量
更新于2023-05-22
评论
收藏 77KB PDF 举报
大家都知道抽象类无法实例化,就无法创建对象。所以下面这篇文章主要给大家介绍了关于Java实例化一个抽象类对象的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
资源详情
资源评论
资源推荐

Java实例化一个抽象类对象的方法教程实例化一个抽象类对象的方法教程
大家都知道抽象类无法实例化,就无法创建对象。所以下面这篇文章主要给大家介绍了关于Java实例化一个抽
象类对象的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学
习学习吧。
前言前言
最近在学习的过程中,发现了一个问题,抽象类在没有实现所有的抽象方法前是不可以通过new来构建该对象的,但是抽象方
法却是可以有自己的构造方法的。这样就把我搞糊涂了,既然有构造方法,又不可以通过new来创建,那么抽象类在没变成具
体类的时候究竟可不可以实例化呢?
在Java 中抽象类是不能直接被实例化的。但是很多时候抽象类的该特点成为一个比较麻烦的阻碍。例如如果我想使用动态代
理来给一个抽象类赋予其执行抽象方法的能力,就会有两个困难:1. 动态代理只能创建实现接口的一个代理对象,而不能是
一个继承抽象类的对象。为此标准的 JVM 中有一些实现,例如 javassist 可以使用字节码工具来完成这一目的
(ProxyFactory)。
在 Android 中如果想构造一个抽象类对象,恐怕只有 new ClassName() {} 或者继承之后构造了。但是这两种方法都是不能由其
Class 对象直接操作的,这就导致一些问题上达不到我们需要的抽象能力。
这里详细描述一下第一段所说的场景:这里详细描述一下第一段所说的场景:
首先有一个 interface 文件定义如下(熟悉 Android 的朋友可以看出这是一个提供给 Retrofit 生成代理对象的 Api 配置接
口):
public interface RealApi {
@GET("api1")
Observable<String> api1();
@GET("api2")
Observable<String> api2();
@GET("api3")
Observable<String> api3();
//...其他方法
}
其次再写一个抽象类,只实现接口的其中一个方法(用来模拟接口数据):
@MockApi
public abstract class MockApi implements RealApi {
Observable<String> api3() {
return Observable.just("mock data");
}
}
然后我们需要有一个工具,例如 MockManager ,让他结合我们已存在的 RealApi 对象和 MockApi 类,来构造出一个混合对
象,该对象在执行 MockApi 中已经定义的方法时,为直接执行,在 MockApi 没有定义该方法时,去调用 RealApi 的方法。其
调用方式大概为:
RealApi api = MockManager.build(realApi, MockApi.class);
通过 javassist,完成上述功能很简单,创建一个 ProxyFactory 对象,设置其 Superclass 为MockApi,然后过滤抽象方法,设
置 method handler 调用 realApi 对象的同名同参方法。这里就不再给出代码实现。
但是在 Android 上,javassist 的该方法会抛出
Caused by: java.lang.UnsupportedOperationException: can't load this type of class file
at java.lang.ClassLoader.defineClass(ClassLoader.java:520)
at java.lang.reflect.Method.invoke(Native Method)
at javassist.util.proxy.FactoryHelper.toClass2(FactoryHelper.java:182)
类似的异常。原因大概是 Android 上的虚拟机的实现和标准略微不同,所以这里把方向转为了动态代码生成的另一个方向
Annotation Processor。
使用使用 Annotation Processor 实现的话,思路就简单的多了,但过程还是有些曲折:实现的话,思路就简单的多了,但过程还是有些曲折:
首先定义一个注解,用来标记需要构造对象的抽象类
@Target(ElementType.TYPE)
@Documented
@Retention(RetentionPolicy.SOURCE)
public @interface MockApi {
}
Processor 根据注解来获得类的 element 对象,该对象是一个类似 class 的对象。因为在预编译阶段,class 尚未存在,此时
安全验证
文档复制为VIP权益,开通VIP直接复制

评论0