Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.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_Reflection - Fatal编程技术网

Java 如何使用反射在私有字段上运行方法?

Java 如何使用反射在私有字段上运行方法?,java,reflection,Java,Reflection,我有一个资源类 public class SecureResource { private HttpServletRequest request; // some more things here } 我想使用java反射运行request.getHeader('X-AUTH') 我试过什么? Field f = response.getResourceClass().getDeclaredField("request"); f.setAccessible(true); f

我有一个资源类

public class SecureResource {

    private HttpServletRequest request;

    // some more things here
}
我想使用java反射运行
request.getHeader('X-AUTH')

我试过什么?

Field f = response.getResourceClass().getDeclaredField("request");
f.setAccessible(true);
f.get("X-AUTH");
我明白了

java.lang.IllegalArgumentException: Can not set javax.servlet.http.HttpServletRequest field com.sn.bb.service.SecureResource.request to java.lang.String
我错过了什么?如何在
f
上运行
request.getHeader('X-AUTH')

您当前正在尝试获取字段,就像它是
java.lang.String
实例上的字段一样。您可能已经有了一个
SecureResource
的实例,因此您希望调用:

Field f = response.getResourceClass().getDeclaredField("request");
f.setAccessible(true);
HttpServletRequest request = (HttpServletRequest) f.get(resource);
String auth = request.getHeader("X-AUTH");
(其中,
resource
是对
SecureResource
的相关实例的引用)

也就是说,即使你已经让它工作了,如果可能的话,我也会极力阻止它。您的代码在有严格的安全管理器的情况下不起作用,在实现发生变化时,代码会变得脆弱,它通常表示您正在尝试做一些类没有设计的事情。

您当前正在尝试获取字段,就好像它是
java.lang.String
实例上的字段一样。您可能已经有了一个
SecureResource
的实例,因此您希望调用:

Field f = response.getResourceClass().getDeclaredField("request");
f.setAccessible(true);
HttpServletRequest request = (HttpServletRequest) f.get(resource);
String auth = request.getHeader("X-AUTH");
(其中,
resource
是对
SecureResource
的相关实例的引用)


也就是说,即使你已经让它工作了,如果可能的话,我也会极力阻止它。您的代码在有严格的安全管理器的情况下无法工作,它在实现更改时会变得脆弱,它通常表明您正在尝试做一些类没有设计的事情。

我尝试过,但没有得到
这样的实例方法:“java.lang.reflect.Field.getHeader”
我尝试过,但没有得到
这样的实例方法:“java.lang.reflect.Field.getHeader”
Jon,当我执行
HttpServletRequest=(HttpServletRequest)f.get(response.getResourceClass().newInstance())时,我看到了
NullPointerException
@daydreamer:那你为什么要调用
newInstance
?首先,您需要有一个
SecureResource
的实例,以便访问该字段。退一步,试着准确地计算出你想要做什么-想象一下如果这个字段不是私有的-那么你会怎么做?Jon,当我做
HttpServletRequest=(HttpServletRequest)f.get(response.getResourceClass().newInstance())时,我看到
NullPointerException
@daydreamer:那你为什么要调用
newInstance
?首先,您需要有一个
SecureResource
的实例,以便访问该字段。退一步,试着弄清楚你到底想做什么——想象一下,如果这个领域不是私人的——那么你会怎么做?