相关疑难解决方法(0)

如何使用反射访问对象中的字段值

我的问题:如何克服IllegalAccessException使用反射访问对象字段的值.

扩展:我正在尝试学习反思,以使我的一些项目更通用.当我IllegalAccessException试图调用field.getValue(object)以获取该对象中该字段的值时,我遇到了一个问题.我可以得到名字和类型.

如果我将声明更改为private,public则此工作正常.但是为了遵循封装的"规则",我不想这样做.任何帮助将不胜感激!谢谢!

我的代码:

package main;

import java.lang.reflect.Field;

public class Tester {

  public static void main(String args[]) throws Exception {
    new Tester().reflectionTest();
  }

  public void reflectionTest() throws Exception {
    Person person = new Person("John Doe", "555-123-4567", "Rover");
    Field[] fields = person.getClass().getDeclaredFields();
    for (Field field : fields) {
      System.out.println("Field Name: " + field.getName());
      System.out.println("Field Type: " + field.getType());
      System.out.println("Field Value: " + field.get(person));
      //The line above throws: Exception in …
Run Code Online (Sandbox Code Playgroud)

java reflection exception illegalaccessexception

39
推荐指数
2
解决办法
3万
查看次数

如何通过反射找出方法的可见性?

语境:

我正在尝试学习/练习TDD并决定我需要创建一个不可变的类.

为了测试'immutability invariant'(你能这么说吗?)我想我会通过反射调用类中的所有公共方法,然后检查该类之后是否没有改变.这样我以后不太可能不小心打破不变量.这可能是也可能不是实际/有效的,但我认为这对我来说也是一种反思.

策略:

  • 用途getMethods():

使用getMethods(),我只获得公共接口,但当然这包括所有继承的方法.那么问题是诸如wait()和notify()之类的方法会导致InvocationTargetExceptions,因为我还没有同步等...

  • 用途getDeclaredMethods():

(天真?)假设只有我声明的方法能够破坏类的不变性,我尝试使用getDeclaredMethods().不幸的是,这会调用在类中声明的所有方法,private和public,而不是超类.私人方法显然不相关,因为它们被允许打破不变性.

题:

所以我的问题是,如何才能找出通过getDeclaredMethods()公共获取的方法是否公开,以便我可以通过反射调用它?通过文档看我没有什么东西跳出来......

我可以看到解决这个问题的其他方法,比如特别忽略像wait()等方法,但这看起来比我能处理的更糟糕.

java reflection visibility access-modifiers

4
推荐指数
1
解决办法
2607
查看次数

如何使用java反射查找成员的访问修饰符

使用java反射查找成员的访问修饰符

private final static long serialId = 1L;
protected String title;
public String FirstName;
Run Code Online (Sandbox Code Playgroud)

我需要知道哪个变量是私有的、受保护的和公共的?

java reflection

3
推荐指数
1
解决办法
5378
查看次数