在运行时更改访问修饰符

Posted

技术标签:

【中文标题】在运行时更改访问修饰符【英文标题】:Change the access modifier in runtime 【发布时间】:2013-10-19 23:02:29 【问题描述】:

只是为了举例,我写了这个:

public class MyClass

    private int MyMethod()
    
        return 1;
    

是否有任何方法可以在运行时使用反射或其他方式将MyClass::MyMethod() 的访问修饰符更改为public,然后调用它?

【问题讨论】:

【参考方案1】:

不确定是否可以修改访问说明符,但可以通过反射调用私有方法,例如:

MyClass instance = new MyClass();
MethodInfo yourMethod = instance
                            .GetType()
                            .GetMethod("MyMethod", BindingFlags.NonPublic | BindingFlags.Instance);
var returnValue = yourMethod.Invoke(instance, new object[]  );
Console.WriteLine(returnValue);

【讨论】:

【参考方案2】:

不,一个类就是它的本质,你不能在运行时改变它。

您可以创建一个具有成员的新类,但 MyMethod 将是公共的,但它不再是同一个类。

无论如何,我想不出在任何情况下做这样的事情会有任何意义。

【讨论】:

以上是关于在运行时更改访问修饰符的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2015,无法更改新资源文件的访问修饰符

更改Java中重写方法的访问修饰符?

更改 Scala 默认类访问修饰符

在发布 Java 应用程序之前是不是必须更改访问修饰符?

java访问修饰符

Java访问修饰符