王学岗ASM

服务发现

package com.example.testasm;

import android.content.Context;
import android.os.Bundle;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.example.testasm.celuemoshi.Content;
import com.example.testasm.celuemoshi.SPIService;
import com.example.testasm.celuemoshi.SpiServiceImpl2;

import java.util.Iterator;
import java.util.ServiceLoader;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        Content content = new Content(new SpiServiceImpl2());
//        content.executeSpiService();
        ServiceLoader<SPIService> load = ServiceLoader.load(SPIService.class);
        //可以迭代文本文件中所有的实现类,新建文件需要与java同级目录(main-新建directory-resource)
        //同样方法创建META-INF和services文件夹,接着创建文件包名+类名(该文件中就写服务的实现类)
        //当读取到这些文件的实现类后,使用反射得到这些类
        Iterator<SPIService> iterator = load.iterator();//LazyIterator
        //查找所有的实现类
        while(iterator.hasNext()){//获取文本文件的内容,得到需要实现类的名字
            SPIService spiService = iterator.next();//反射注入实现类的对象
            spiService.execute();//执行实现类中的方法
        }
    }
}
package com.example.testasm.celuemoshi;

public interface SPIService {
   void execute();
}

package com.example.testasm.celuemoshi;

import android.util.Log;

public class SpiServiceImpl1 implements SPIService{
    @Override
    public void execute() {
        Log.i("赵云","第一种执行方法");
    }
}

package com.example.testasm.celuemoshi;

import android.util.Log;

public class SpiServiceImpl2 implements SPIService{
    @Override
    public void execute() {
        Log.i("赵云","第二种执行方法");
    }
}

package com.example.testasm.celuemoshi;

import android.util.Log;

public class SpiServiceImpl3 implements SPIService{
    @Override
    public void execute() {
        Log.i("赵云","第三种执行方法");
    }
}

com.example.testasm.celuemoshi.SPIService文件

com.example.testasm.celuemoshi.SpiServiceImpl1
com.example.testasm.celuemoshi.SpiServiceImpl2
com.example.testasm.celuemoshi.SpiServiceImpl3

在这里插入图片描述
这个框架有个好处,如果以后我们新增加第四个实现类,只需要在com.example.testasm.celuemoshi.SPIService文件中增加一个包名+类名即可,其它地方不需要改变

ASM

首先暗转插件:ASM Bytecode Viewer
在这里插入图片描述
1,逆波兰表达式 (后缀表达式)

dependencies {
    implementation 'org.ow2.asm:asm:9.3'       // 最新版本可以根据需要调整
    implementation 'org.ow2.asm:asm-util:9.3'
    implementation 'org.ow2.asm:asm-commons:9.3'
    implementation 'org.ow2.asm:asm-tree:9.3'
}

基本流程
首先准备class文件,文件准备好后,用流绑定ClassReader。文件的信息就会被读取到ClassReader中,然后进行Class信息的修改(accept()),修改后的结果填充到ClassWriter中,输出到byte[]。byte[]就是修改后的文件

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值