我不太确定如何反映只具有包级访问权限的类。我知道如何反映任何具有公共访问权限的类,但我无法找出以下示例的反射方法:
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
只有包级别的访问权限。这使得对该类进行反射变得困难。我继续收到编译器错误消息,指出:
Main.java:4: error: oneimpl is not public in one; cannot be accessed from outside package
oneimpl o = con.newInstance(t);
我已经查阅了一些帖子,试图自己解决这个问题,但即使阅读了大部分“类似问题”的内容、
AccessibilityObject
api和通用反射过程的内容,我仍然不清楚如何实现这一目标。最终,我的目标是通过反映API的特定部分来构建对象,以便soot/spark可以构建正确的调用图。我实际上并不是在Android API内工作。
oneimpl
中的声明:private oneimpl(test t){mTest = t;}
。即使它是公共的,您仍然必须调用setAccessible
,因为不可访问的类中的公共构造函数/方法被视为不可访问。 - neuronaut