如何使用反射在私有字段上运行方法? [英] How to run method on private field using reflection?

查看:26
本文介绍了如何使用反射在私有字段上运行方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个资源类

公共类 SecureResource {私有 HttpServletRequest 请求;//这里还有一些东西}

我想使用 java 反射来运行 request.getHeader('X-AUTH')?

我尝试了什么?

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

我明白了

java.lang.IllegalArgumentException:无法将 javax.servlet.http.HttpServletRequest 字段 com.sn.bb.service.SecureResource.request 设置为 java.lang.String

我错过了什么?如何在 f 上运行 request.getHeader('X-AUTH')?

解决方案

您当前正在尝试获取字段,就像它是 java.lang 实例上的字段一样.字符串.大概你已经有一个 SecureResource 的实例,所以你想调用:

Field f = response.getResourceClass().getDeclaredField("request");f.setAccessible(true);HttpServletRequest request = (HttpServletRequest) f.get(resource);String auth = request.getHeader("X-AUTH");

(其中 resource 是对 SecureResource 的相关实例的引用.)

也就是说,即使你已经让它工作了,如果可能的话,我也会强烈劝阻它.您的代码在有严格的安全管理器的情况下将无法工作,在实现更改时它会变得脆弱,并且通常表明您正在尝试做一些类不是为之设计的东西.

I have a resource class as

public class SecureResource {

    private HttpServletRequest request;

    // some more things here
}

I would like to tun run request.getHeader('X-AUTH') using java reflection?

what I have tried?

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

I get

java.lang.IllegalArgumentException: Can not set javax.servlet.http.HttpServletRequest field com.sn.bb.service.SecureResource.request to java.lang.String

What is that I am missing? How can I run request.getHeader('X-AUTH') on f?

解决方案

You're current trying to get the field as if it were a field on an instance of java.lang.String. Presumably you already have an instance of SecureResource, so you'd want to call:

Field f = response.getResourceClass().getDeclaredField("request");
f.setAccessible(true);
HttpServletRequest request = (HttpServletRequest) f.get(resource);
String auth = request.getHeader("X-AUTH");

(Where resource is a reference to the relevant instance of SecureResource.)

That said, even when you've got it working I'd strongly discourage it if at all possible. Your code won't work in scenarios where there's a strict security manager, it will be brittle in the face of a change of implementation, and it generally suggests you're trying to do something for which the class wasn't designed.

这篇关于如何使用反射在私有字段上运行方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆