gpt4 book ai didi

java - Java中从类外部调用私有(private)方法

转载 作者:行者123 更新时间:2023-12-01 22:24:02 25 4
gpt4 key购买 nike

我有一个带有私有(private)方法的类,现在我想在类之外访问该私有(private)方法,这可以使用java中的反射包来实现。 但是,如果我们将类构造函数设为私有(private),那么如何访问该方法呢?在下面的代码中,考虑 PrivateMethodClass 具有私有(private)方法 m1 和私有(private)构造函数。

package allprograms;
import java.lang.reflect.*;
public class RecursionDemo {

public static void main(String[] args) {

try
{

PrivateMethodClass p = PrivateMethodClass.getInstance();
//Class c = Class.forName("allprograms.PrivateMethodClass"); //1
Class c = Class.class.asSubclass(p.getClass());
//Object o = c.newInstance(); //2
Method m = c.getDeclaredMethod("m1", null); //3
m.setAccessible(true);
m.invoke(p, null); //4

} /*
* catch(ClassNotFoundException e) { //for 1
* System.out.println("ClassNotFound"); }
*/catch (IllegalAccessException/* | InstantiationException */e) { // for 2
System.out.println("Illigal Access Exception or Instantiation Exception");
} catch(NoSuchMethodException e) { //for 3
System.out.println("No such Method Exception e");
} catch(Exception e) { //for 4
System.out.println("Invocation Target Exception ");
}
}

}

最佳答案

我不明白你的问题是什么。静态方法getInstance()上课PrivateMethodClass是公共(public)的,所以调用它没有问题,这意味着 PrivateMethodClass 的构造函数是否不重要。是否私有(private)

如果,另一方面,您询问如何实例化类 PrivateMethodClass 没有使用方法getInstance() ,这也不是问题。正如您使用getDeclaredMethod()一样调用(私有(private))方法 m1() ,你可以调用方法getDeclaredConstructor()获取对私有(private)构造函数的引用。示例代码如下:

Class<?> c = PrivateMethodClass.class;
try {
Constructor<?> ctor = c.getDeclaredConstructor();
ctor.setAccessible(true);
Object obj = ctor.newInstance();
System.out.println(obj);
if (obj instanceof PrivateMethodClass) {
PrivateMethodClass p = (PrivateMethodClass) obj;
Method m = c.getDeclaredMethod("m1");
m.setAccessible(true);
m.invoke(p);
}
}
catch (Exception x) {
x.printStackTrace();
}

我错过了什么吗?

关于java - Java中从类外部调用私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58572715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com