java – 随时调用其他方法调用方法

前端之家收集整理的这篇文章主要介绍了java – 随时调用其他方法调用方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有办法做出一种每当一个方法调用调用的“超级方法”,即使是非定义的方法呢​​?像这样排序:
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

猜你在找的Java相关文章