All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.imqa.asm.GlobalClassVisitor Maven / Gradle / Ivy

There is a newer version: 2.25.11
Show newest version
package io.imqa.asm;

import org.objectweb.asm.*; 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

import io.imqa.injector.util.Logger;
import io.imqa.injector.util.BuildOption;

public class GlobalClassVisitor extends ClassVisitor {
	String superClass = "";
	String className = "";
	boolean eventClass = false;
	boolean webviewClass = false;
	String[] interfaces;


	List finderList = new ArrayList();

	public GlobalClassVisitor(ClassVisitor cv) {
		super(Opcodes.ASM5, cv);


		if (BuildOption.eventListenerInject) {
			if (!isFinderExist(EventFinder.class))
				finderList.add(new EventFinder());
		}
		if (BuildOption.webViewInject) {
			if (!isFinderExist(WebviewFinder.class))
				finderList.add(new WebviewFinder());
		}
		if (BuildOption.fragmentInject) {
			if (!isFinderExist(FragmentMakerFinder.class))
				finderList.add(new FragmentMakerFinder());
		}
	}

	private boolean isFinderExist(Class targetFinder) {
		boolean isExist = false;
		for (Finder finder : finderList) {
			if (finder.getClass() == targetFinder)
				isExist = true;
		}

		return isExist;
	}

	@Override
	public void visit(int version, int access, String name,
		String signature, String superName, String[] interfaces) {
		cv.visit(version, access, name, signature, superName, interfaces);
		this.className = name;
		this.superClass = superName;
		this.interfaces = interfaces;

		//Logger.d("Extended", superName);
		for(Finder finder : finderList) {
			// TODO 만약 event를 커스텀 하여 새로 만들었을 경우 이 클래스를 또 다시 extends 한 클래스를 찾아야 한다.
			if (finder.find(name, superName, interfaces)) {
				finder.init();
			}
		}
	}

	@Override 
	public MethodVisitor visitMethod(int access, String name, 
			String desc, String signature, String[] exceptions) { 
		//Logger.d("Name: "+name+", "+desc + ", "+signature+", "+access);
		MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); 

		for(Finder finder : finderList) {
			mv = finder.getVisitor(interfaces, className, superClass, access, name, desc, mv);
		}

		return mv;
	}
	
	@Override
	public void visitEnd() {
		// TODO 라이프사이클 관련은 프래그먼트로 넣을 것
		for(Finder finder : finderList) {
			finder.visitEnd(cv, className, superClass, interfaces);
		}

		cv.visitEnd();
	}



}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy