有没有办法做出一种每当一个方法被调用时调用的“超级方法”,即使是非定义的方法呢?像这样排序:
public void onStart() {
System.out.println("Start");
}
public void onEnd() {
System.out.println("End");
}
public SuperMethod superMethod() {
System.out.println("Super");
}
// "Start"
// "Super"
onStart();
// "End"
// "Super"
onEnd();
// "Super"
onRun();
感谢任何帮助.
编辑 – 细节:我有一个库更新很多,并在每次更新时重新混淆.为了使我的工作流程更简单,我使程序自动更新库(需要做我想做的,我不会那么具体说明为什么,但我的程序将与未来的更新),我有混淆映射下载与库,我想做一个名为Library的代理例如,然后当我调用Library.getInstance()时,它将获取getInstance()的模糊映射,并调用库的方法getInstance()或abz,因为它被映射到这个当前时刻.
解决方法
这是使用
Proxy类的纯Java中的一个实现:
import java.lang.reflect.*;
import java.util.*;
public class Demo
{
public static void main(String[] args)
{
Map<String,String> map = new HashMap<String,String>();
map.put("onStart","abc");
map.put("onEnd","def");
Library library = new LibraryProxy(map,new LibraryImpl()).proxy();
library.onStart();
library.onEnd();
library.onRun();
}
}
interface Library
{
void onStart();
void onEnd();
void onRun();
}
class LibraryImpl
{
public void abc() { System.out.println("Start"); }
public void def() { System.out.println("End"); }
}
class LibraryProxy implements InvocationHandler
{
Map<String,String> map;
Object impl;
public LibraryProxy(Map<String,String> map,Object impl)
{
this.map = map;
this.impl = impl;
}
public Library proxy()
{
return (Library) Proxy.newProxyInstance(Library.class.getClassLoader(),new Class[] { Library.class },this);
}
@Override
public Object invoke(Object proxy,Method m,Object[] args) throws Throwable
{
Object res = null;
String name = map.get(m.getName());
if (name == null) {
System.out.println("[" + m.getName() + " is not defined]");
} else {
m = impl.getClass().getmethod(name,m.getParameterTypes());
res = m.invoke(impl,args);
}
System.out.println("super duper");
return res;
}
}
输出:
Start super duper End super duper [onRun is not defined] super duper