wiki.php 用Markdown写wiki是一种什么样的体验?

判断堆栈,禁止反射调用.md

最后更新于 2019-10-06 15:00:18

作者:chris guo
链接:https://www.zhihu.com/question/47896687/answer/108146674
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class Program
{
    public static void Main()
    {
        //Reflected Invoke
        var type = typeof(A);
        var method = type.GetMethod("Do", BindingFlags.Static | BindingFlags.NonPublic);
        method.Invoke(null, null);

        //Normal Invoke
        A.PublicDo();

        Console.ReadLine();
    }
}

class A
{
    public static void PublicDo()
    {
        Do();
    }

    private static void Do()
    {
        StackFrame[] stacks = new StackTrace().GetFrames();
        if(stacks[1].GetMethod().DeclaringType.FullName == "System.RuntimeMethodHandle")
        {
            throw new Exception("Reflected Invoke!");
        }

        Console.WriteLine("aaa");
    }
}

java里也可以根据stacktrace判断。
Thread.currentThread().getStackTrace()
判断Method.invoke方法,不过要判断的仔细一点。。