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

标签 java reflection

我不太确定如何反射(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/

相关文章:

java - 在 Eclipse 中,当我转到 File->New-Project 时没有 Android Project

java - 如何修复重复资源错误android studio

java - 在运行时用类对象定义泛型类型

c# - 如何在Unity.Mvc IoC容器中注册从基类继承的所有类?

java - Codenameone android 构建错误 list 合并

java - Spring - 如何获取属性文件的子集而不枚举所有必需的属性

java - C# 通用通配符

java - Java中基于外部xml的运行时类实例化

java - 在通用上下文中使用 getActualTypeArguments

c# - typeof() 有效,GetType() 在检索属性时无效