加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:47:21 所属栏目:Java 来源:网络整理
导读:有没有办法做出一种每当一个方法被调用时调用的“超级方法”,即使是非定义的方法呢???像这样排序: public void onStart() { System.out.println("Start");}public void onEnd() { System.out.println("End");}public SuperMethod superMethod() { System.o
有没有办法做出一种每当一个方法被调用时调用的“超级方法”,即使是非定义的方法呢???像这样排序:
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读