android 扫描包下所有类

本文介绍如何在Android应用中扫描指定包下的所有类。通过代码结构解析,主要在MainActivity中进行操作,详细步骤包括...(此处省略具体实现细节)

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1. 代码结构:


2. MainActivity:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button btnScan = (Button)findViewById(R.id.btnScan);
        btnScan.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                Scanner.scan();
            }
        });
    }
}

3. Scanner:

import java.lang.reflect.Field;
import java.util.Enumeration;

import dalvik.system.DexFile;
import dalvik.system.PathClassLoader;

public class Scanner {

	private static Field dexField;

	static {
		try {
			dexField = PathClassLoader.class.getDeclaredField("mDexs");
			dexField.setAccessible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void scan() {
		try {
			PathClassLoader classLoader = (PathClassLoader) Thread.currentThread().getContextClassLoader();

			DexFile[] dexs = (DexFile[]) dexField.get(classLoader);
			for (DexFile dex : dexs) {
				Enumeration<String> entries = dex.entries();
				while (entries.hasMoreElements()) {
					String entry = entries.nextElement();

					Class<?> entryClass = dex.loadClass(entry, classLoader);
					if (entryClass != null) {
						IBizAnno annotation = entryClass.getAnnotation(IBizAnno.class);
						if (annotation != null) {
							System.out.println("name=" + annotation.name() + "; class=" + entryClass.getName());
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

4. IBizAnno:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
public @interface IBizAnno { 
    String name(); 
} 

5. IBiz:

public interface IBiz { 
    Object biz(Object... params);
}
6. 实现类:

@IBizAnno(name="11111")
public class IBizImpl1 implements IBiz {

    @Override
    public Object biz(Object... params) {
        return "IBizImpl1: " + params[0];
    }

}


@IBizAnno(name="22222")
public class IBizImpl2 implements IBiz {

    @Override
    public Object biz(Object... params) {
        return "IBizImpl2: " + params[0];
    }

}

运行结果:








评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值