注解绕过微信支付和分享的局限

首先看下系统演变
版本1

这里写图片描述

版本2

这里写图片描述

版本3
这里写图片描述

分析版本3,新增一个功能支付,但是不能再APP中添加功能和代码,这时候我们可以这样,我们单独做一个支付功能,然后APP去调用支付的主Activity即可,但是需要在APP的mainifest中声明activity

我们将分为三个module:compiler和annotation,pay

首先compiler中添加注解:包括包名和类名

@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.TYPE)
public @interface WXPayEntry {
    /**
     * 包名
     */
    String packageName();
    /**
     * 类的class
     */
    Class<?> entryClass();
}

compiler需要添加依赖

 compile 'com.google.auto.service:auto-service:1.0-rc3'
compile 'com.squareup:javapoet:1.8.0'
//添加支持中文
tasks.withType(JavaCompile){
    options.encoding='UTF-8'
}

整个项目的builder.gradle添加依赖

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        maven { url "https://maven.google.com"}
        mavenCentral()
        //maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
    }
}

JokeProcessor生成器

@AutoService(Processor.class)
public class JokeProcessor extends AbstractProcessor {

    private Filer mFiler;

    @Override
    public synchronized void init(ProcessingEnvironment processingEnv) {
        super.init(processingEnv);
        mFiler = processingEnv.getFiler();
    }

    @Override
    public Set<String> getSupportedAnnotationTypes() {
        Set<String> types = new LinkedHashSet<>();
        for (Class<? extends Annotation> annotation : getSupportedAnnotations()) {
            types.add(annotation.getCanonicalName());
        }
        return types;
    }

    private Set<Class<? extends Annotation>> getSupportedAnnotations() {
        Set<Class<? extends Annotation>> annotations = new LinkedHashSet<>();
        annotations.add(WXPayEntry.class);
        return annotations;
    }

    //设置为最大版本
    @Override
    public SourceVersion getSupportedSourceVersion() {
        return SourceVersion.latestSupported();
    }

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        // 生成 一个 Class xxx.wxapi.WXPayEntryActivity extends BaseWXPayActivity
        generateWXPayCode(roundEnv);
        return false;
    }

    private void generateWXPayCode(RoundEnvironment env) {
        WXPayEntryVisitor visitor = new WXPayEntryVisitor();
        visitor.setFiler(mFiler);
        scanElement(env, WXPayEntry.class, visitor);
    }

    private void scanElement(RoundEnvironment roundEnvironment, Class<? extends Annotation> annotation, AnnotationValueVisitor visitor) {
        Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(annotation);
        for (Element element : elements) {
            //获取到该声明上所添加的注解的实际值
            List<? extends AnnotationMirror> annotationMirrors = element.getAnnotationMirrors();
            for (AnnotationMirror annotationMirror : annotationMirrors) {
                Map<? extends ExecutableElement, ? extends AnnotationValue> elementValues = annotationMirror.getElementValues();
                for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : elementValues.entrySet()) {
                   //将获得的注解上的实际的值给visitor
                    entry.getValue().accept(visitor, null);
                }
            }
        }
    }
}

WXPayEntryVisitor代码

public class WXPayEntryVisitor extends SimpleAnnotationValueVisitor7<Void,Void> {
    private String mPackageName;
    private TypeMirror mTypeMirror;
    private Filer mFiler;

    @Override
    public Void visitString(String s, Void aVoid) {
        mPackageName=s;
        return aVoid;
    }
    public void setFiler(Filer mFiler) {
        this.mFiler = mFiler;
    }
    @Override
    public Void visitType(TypeMirror t, Void aVoid) {
        mTypeMirror=t;
        generateWXPayCode();
        return aVoid;
    }

    /**
     * 生成类
     */
    private void generateWXPayCode() {
        // 生成 一个 Class xxx.wxapi.WXPayEntryActivity extends BaseWXPayActivity
        TypeSpec.Builder builder = TypeSpec.classBuilder("WXPayEntryActivity")
                .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
                .superclass(TypeName.get(mTypeMirror));
        try {
            JavaFile.builder(mPackageName+".wxapi",builder.build())
                    .addFileComment("微信支付自动生成")
                    .build().writeTo(mFiler);
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("失败了");
        }
    }
}

joke-play中WXPayActivity

public class WXPayActivity extends AppCompatActivity {
}

BaseWXPayActivity

public class BaseWXPayActivity extends WXPayActivity {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

}

app中使用

@WXPayEntry(packageName = "com.example.WXPay",
        entryClass = BaseWXPayActivity.class)
public class BaseApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
    }
}

最终会生成这个类

// 微信支付自动生成
package com.example.WXPay.wxapi;

import com.example.joke_pay.BaseWXPayActivity;

public final class WXPayEntryActivity extends BaseWXPayActivity {
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值