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
的实例,以便访问该字段。退一步,试着弄清楚你到底想做什么——想象一下,如果这个领域不是私人的——那么你会怎么做?