服务发现
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[]就是修改后的文件