gpt4 book ai didi

java - 反射(reflect)一个只有包级访问权限的类

转载 作者:行者123 更新时间:2023-11-30 07:00:51 31 4
gpt4 key购买 nike

我不太确定如何反射(reflect)仅具有包级访问权限的类。我知道如何反射(reflect)任何具有公共(public)访问权限的类,但我不知道如何反射(reflect)以下示例:

public class Main {
public static void main(String[] args) {
test t = new test();
Constructor<one.oneimpl> con = one.oneimpl.class.getDeclaredConstructor(test.class);
oneimpl o = con.newInstance(t);
o.doIt();
}
}

======================

package one;
// implementation class for mimicking android api
class oneimpl extends one {
Test mTest;
private oneimpl(test t){mTest = t;}
public void doIt(){System.out.println("Do It!");}
public void dontDoit(){System.out.println("Don't Do It!");}
}

======================

package one;
// abstract class for mimicking android api
abstract class one {
public void doIt();
public void dontDoIt();
}

======================

package one;
// empty class for mimicking android api
public class test {}

如您所见,one 类只有包级访问权限。这让我很难反射(reflection)类。我继续收到编译器错误,指出:

Main.java:4: error: oneimpl is not public in one; cannot be accessed from outside package
oneimpl o = con.newInstance(t);

我已经查看了一些帖子,自己解决了这个问题,但即使在阅读了大部分“类似问题”、阅读了 AccessibilityObject api 并阅读了通用反射程序之后,它仍然不清楚告诉我如何实现这一目标。

最终我要做的是反射(reflect) API 的特定部分以构建对象,以便 soot/spark 可以构建适当的调用图。我实际上并没有在 android API 内部工作。

最佳答案

您需要在每一步都使用反射才能完成您想要做的事情。

首先,由于您不能直接从包外部引用 one 包中的包范围类,因此您需要动态加载该类(还要注意 ? 而不是直接使用 oneimpl):

Class<?> oneImplClass = Class.forName("one.oneimpl");

然后您可以获得构造函数和doIt 方法(确保将这两者都设置为可访问,否则会出现运行时错误):

Constructor<?> constructor = oneImplClass.getDeclaredConstructor(test.class);
constructor.setAccessible(true);
Method doIt = oneImplClass.getDeclaredMethod("doIt");
doIt.setAccessible (true);

接下来,实例化类。您必须将其转换为 Object,因为您不能直接引用该类):

Object oneImpl = (Object) constructor.newInstance();

最后,您可以调用 doIt 方法:

doIt.invoke(oneImpl);

最后一点:命名类时应遵循 Java 命名约定:oneimpl 应为 OneImpltest 应为 测试。否则像 one.oneimpl 这样的东西最终看起来像一个包名而不是一个完全限定的类名。

关于java - 反射(reflect)一个只有包级访问权限的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30202960/

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