Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 最好使用反射或我的小技巧来访问私有方法?_Java_Inheritance_Reflection - Fatal编程技术网

Java 最好使用反射或我的小技巧来访问私有方法?

Java 最好使用反射或我的小技巧来访问私有方法?,java,inheritance,reflection,Java,Inheritance,Reflection,我需要从另一个类访问私有方法。我有两种访问它的方法。第一个是明显的反映。第二种是黑客。我需要调用的私有方法是从受保护的内部类的accessPrivateMethod方法调用的。这个方法实际上只调用我需要的私有方法。那么,是使用反射访问它更好,还是通过扩展调用它的受保护的内部类来“破解”它更好。见代码: method = object.getClass().getDeclaredMethod("privateMethod"); method.setAccessible(true); Object

我需要从另一个类访问私有方法。我有两种访问它的方法。第一个是明显的反映。第二种是黑客。我需要调用的私有方法是从受保护的内部类的accessPrivateMethod方法调用的。这个方法实际上只调用我需要的私有方法。那么,是使用反射访问它更好,还是通过扩展调用它的受保护的内部类来“破解”它更好。见代码:

method = object.getClass().getDeclaredMethod("privateMethod");
method.setAccessible(true);
Object r = method.invoke(object);
或: (ProtectedInnerClass是我要访问其私有方法的类中受保护的内部类。)

还有一些想法:

1) 我在这里看到很多人说,使用反射只是作为最后的手段

2) 反射可能导致安全问题?(SecurityManager有时可以拒绝访问设置?)这需要在任何机器/设置上始终工作

如果我的黑客不清楚,请这样说,我会尽量详细说明。谢谢


PS:我需要访问的私有方法在JUNG库中。调用它修复了一个bug。AKA我正试图找到一种无需编辑任何JUNG-jar的解决方法。

这个问题出现的原因可能是设计不好或Java不允许“子包”可见性。但是,如果性能是一个问题,那么就使用“小”黑客。否则,请选择使用反射的美学解决方案。但是首先,试着看看你的设计是否好。

1)我在这里看到很多人说,使用反射只是作为最后的手段。

假设你的黑客真的有效,最好使用它,而不是使用反射。这是因为使用反射要昂贵得多

以下是关于以下内容的摘录:

  • 由于反射涉及动态解析的类型,因此无法执行某些Java虚拟机优化。因此,反射式操作的性能比非反射式操作要慢,应该避免在性能敏感应用程序中频繁调用的代码段中使用反射式操作
2)反射可能导致安全问题?(SecurityManager有时会拒绝访问设置?)这需要在任何机器/设置上一直工作。

同样地:

  • 反射需要运行时权限,在安全管理器下运行时,该权限可能不存在。对于必须在受限安全上下文(如小程序)中运行的代码,这是一个重要的考虑因素
因此,不仅可以拒绝setAccessible方法,而且可以拒绝反射的使用

另一个需要考虑的问题是,为了在不实例化的情况下调用Hack类方法,需要将内部方法设置为static

class Hack extends ProtectedInnerClass {
   public static void accessPrivateMethod() {
       super.callPrivateMethod();
   }
}
Hack.accessPrivateMethod();

这是设计不佳的标志。如果需要使用另一个类中的
private
方法,则它必须不是
private
,而是
protected
public
。假设此方法来自第三方库,在该库中您无法更改代码,但可以访问代码,我建议将此代码移动到实用程序类中,并从那里使用它。如果此方法在另一个类中是私有的,则您不应该访问它。如果必须这样做,你的设计就很糟糕。顺便说一句,你不能从子类中访问任何
私有
字段或方法,甚至不能使用
超级
关键字,所以你的黑客攻击不会起作用。我需要访问的私有方法在JUNG库中。调用它修复了一个bug。AKA我正试图找到一个无需编辑任何JUNG Jar的解决方案。你所说的子包可见性是什么意思?我添加了PS注释,这解释了我为什么要这么做。我永远不会使用这种策略来设计东西:“我需要访问的私有方法是在JUNG库中。调用它可以修复bug。也就是说,我试图找到一种无需编辑任何JUNG jar的解决方法。”然而,包
com.mycompany
com.mycompany.gui
是完全不同的包,他们可能看起来很熟悉。使用受保护的
可见性时,这些包不能使用彼此的受保护方法。即使是
com.mycompany.gui
包也不能使用
com.mycompany
中受保护的内容。是的,它们可以,但只能通过类继承。
class Hack extends ProtectedInnerClass {
   public static void accessPrivateMethod() {
       super.callPrivateMethod();
   }
}
Hack.accessPrivateMethod();