一个 Java 的问题,来这里问下,这问题很白痴吗。。怎么我在 segmentfault 提问被踩了两次,又没一个人肯回答一下。。

2019-11-30 09:59:47 +08:00
 so2back

好像不能发图片,我直接复制一下自己用来解释的代码,应该能看得懂说什么吧。。。我就想问问 generateMap 这个方法是能够实现的了的吗。。


public static void main(String[] args) { String name = "abc"; Integer age = 20; List<string> hobby = new ArrayList(); hobby.add("run"); hobby.add("swim"); // 这里直接调用方法,放入想要生成 map 的参数 generateMap(name, age, hobby); }</string>

public static Map generateMap(Object... entrys) {
    // 然后在这里根据接到的可变参数,生成一个 map,生成的 map 如下,就是根据收到的参数的名称对应放进去

// Map map = new HashMap(); // map.put("name", name); // map.put("name", age); // map.put("name", hobby); }

9898 次点击
所在节点    Java
86 条回复
hoyixi
2019-11-30 10:20:02 +08:00
还是没明白你到底想问什么

你直接放 segmentfault 原问题的链接不就行了
wysnylc
2019-11-30 10:20:38 +08:00
@lnchy #12 如果重新申请了指针,请问怎么做到对象引用的传递?
@so2back #16 java8 以前方法内无法拿到参数的参数名只能拿类型,java8 后有 Method.getParameters()方法可以获取
petelin
2019-11-30 10:21:29 +08:00
j 这个问题本质是能不能拿到变量的名字
这得靠反射 我觉得应该不行
不过你可以把它们封装到一个类里 bean 是可以变成 map 的
oneisall8955
2019-11-30 10:22:53 +08:00
JAVA 中估计不行,一个是变量名称一个是变量值。不过 js 中的 es6 版本好像有语法支持生成这样的 map 对象
chenshun00
2019-11-30 10:33:55 +08:00
1、我要做什么,要达到的目的是什么
2、我做的过程出了 xxx 问题
3、针对 xxx 问题我 google 到了一下链接,但是并没有解决我的问题
xxx 链接 1...2....3
hantsy
2019-11-30 10:43:23 +08:00
Map.of("name", name, "age", age)
hantsy
2019-11-30 10:44:13 +08:00
Map.ofEntries(entry("name", name), entry("age", age), ....)
msg7086
2019-11-30 10:46:11 +08:00
那 generateMap("bob", 24, new ArrayList()); 会发生什么?

被踩的原因是这么简单的动脑筋都没有动。

> 这问题很白痴吗

这问题不白痴。但是你没有说明你的思考过程,让人觉得你就是个只会抛问题而不会思考的人。
请花半个小时阅读以下《提问的智慧》,免得以后再被人踩。
so2back
2019-11-30 10:53:20 +08:00
so2back
2019-11-30 10:59:20 +08:00
@msg7086 你是不是没看明白我说的什么?我自己内部用的方法干嘛这么折腾自己?还有,我上面已经解释了这代码有问题了,大概就是被踩的原因了,麻烦看看好吧,还有,你说的这么简单是咋回事?这么简单你又不说是什么,非要来杠我一下?我承认我没说我的思考过程,这里不能发图片,不然我发我搜索这个问题的所有网页记录给你看?
so2back
2019-11-30 10:59:38 +08:00
@hantsy get,回头试试,今天加班- -
leafmaple
2019-11-30 10:59:53 +08:00
@msg7086 #28 手抖发成感谢了。想起来最近看的一篇文章,有的时候提问的人就是想问一个简单的问题,就是因为没找到解决方案,才来求助,向你们这些动不动就拉出提问的智慧,让想起来一句经典的话,Read The Fucking Manual,遇到问题了才会来提问,而不是想得到冷冰冰的去看提问的智慧,网络不仅没有拉近人群的交流,反而更加生疏了吧。
个人观点,不喜勿喷
so2back
2019-11-30 11:01:56 +08:00
@petelin 恩,本质确实是能不能拿到变量的名称,但是还要鉴于可变参数,反射不知道搞不搞得了,不过弄成 bean 不行吧,可变参数挡着了
cedoo22
2019-11-30 11:21:38 +08:00
java 5 语言文档:
Enhancements in JDK 5:
....
Varargs - This facility eliminates the need for manually boxing up argument lists into an array when invoking methods that accept variable-length argument lists.

这个和自动装箱一样,把可变长的 list 自动装箱成了一个数组,所以数组的某个位置上的成员是没有‘别名’的。
试着写了一个 T.java,编译报错:

T.java:3: 错误: 无法在 T 中同时声明 m(String...)和 m(String[])
msg7086
2019-11-30 11:24:36 +08:00
我的确没有看明白你说的是什么。我相信如果你的问题描述得很明白,也不需要下面十几号人一个一个去猜你的问题了,也根本不需要我来尝试帮你解决问题,早就有人答到你的点子上了。

不过根据你后面的回复来看,我发现我的回答一点都没有错,完全符合你说的问题。你需要获得的是调用者向被调用者发送的参数的名称。我们都知道变量名只是一个给人看的标识符,编译成代码以后就变成了具体的值(至于是传值还是传引用这个暂且不表)。age = 24; generateMap(age); 编译完后就成了 generateMap(24) 了。对于 generateMap 函数来说,怎么通过 24 拿到 age ?

如果你一定要这么做的话,当然可以用反射去试。拿到对象的地址,然后去完整的变量列表里搜。只要你能保证每个传入的数据不存在两个变量里,那么用变量传的话是有可能反过来找到曾经用过的变量名的。另外因为是对象的地址,所以非对象的数据是找不到的(比如说数字立即量)。至于在 Java 里,能不能存下你写代码时的变量名,能不能列出所有的本地变量的地址,这我就不得而知了。

我前面告诉你的是你的问题为什么会被踩。如果你一定要理解为这是我的观点,那是你的事情。我本人对你原本就没有负面或者正面的评价。你要是觉得我在杠那也是你的事情。我也没有一丁点的兴趣关心你是否有思考过程,我也不像 SF 那里的人那样见到你的问题就是一顿踩,当然你怎么看我的那也是你的事情。这个帖子最大的问题就是没把问题说清楚,上来就是一句「应该能看得懂说什么吧」,意思是你觉得你不用解释太多了,坛友理所当然就应该看得懂你的问题,看不懂当然是他们的问题。看看这二三十层楼都交换了多少无用信息吧。

言尽于此,不再打扰。
msg7086
2019-11-30 11:30:05 +08:00
@leafmaple 我不会对「简单的问题」说提问的智慧。
当我说提问的智慧的时候,多数是因为提问者没有把问题描述清楚,或者加入了各种错误的前提假设,而这些恰恰是提问的智慧中提到的最重要的问题。同理我还会留言 XY 问题,这是当提问者想要 X 却来问 X 的某个不恰当解决方案 Y 的时候。
即使是简单的问题我也会尽可能详细地回答,但这是一个模糊不清的问题,而不是一个简单的问题。
更何况,这个问题并不简单。要实现这些要求,都已经可以做一个完整的类库了。
dallaslu
2019-11-30 11:47:23 +08:00
楼主挨喷并不冤枉。问题描述不清,基础知识不牢,编程思路不活。

如楼上各位所说,方法内是形参,怎么可能直接取到实参的变量名呢?可变参数也是一个数组,数组内元素曾经用过的变量名更是不可考。(不过说 class 文件中找不到变量名的说法,并不完全认同。毕竟在有 java doc 的情况,注释都是能取得到的。但是那么多变量,怎么确定变量对应哪个名字又是另外一个难关了。)

假设有这么一个超级 Bean,提供了所有可能的方法名,也是需要一个一个的 setName/setAge/setHobby 去调用的。一句 map.put(String, Object) 并不算冗余。

用带 key 和 value 属性的 Entry 做参,也有点脱裤子放屁的嫌疑。不如试试 Bean 转 Map 的工具,或代码生成器吧。
leafmaple
2019-11-30 11:53:50 +08:00
@msg7086 #36 看了你在 35 的评论,其实我想表达的大概就是这个意思,可以指明那块做的还有问题,而不是直接让去读提问的智慧,因为有些人缺的可能就是一个点子,提问的智慧可以作为参考,让他再此之后的提问能有个规范。谢谢回复。交流难免有碰撞。
loqixh
2019-11-30 12:03:07 +08:00
java c++ c#都做不到你想要的效果, 部分元编程强大的语言可以, 比如 D 语言
so2back
2019-11-30 12:24:35 +08:00
发一下自己好歹是思考过的可以把,我本意是觉得不需要这么麻烦的,我的问题可能真的描述不清楚,毕竟我的问题一开始就是写错了的,但是,你觉得这问题你看不下去,或者真的让你觉得烦的,能不能别就杠起我来了?身为一个程序猿,有问题自己先搞,实在不行才到网上问,你就一定得让我大篇幅的贴我究竟干了什么,才有资格问你了?老实说,你回答我了,我内心表示感谢,即使我没有明着回复你感谢你,但是你的解决方案我闲下来了肯定会试一试,你觉得我太水的你可以不管,别耽误您的时间可以把
而且我问这个问题,我就想知道能不能实现,可能 jvm 原理我不了解那么多,那我来求请教一下,大家觉得问题有意义的可以讨论讨论,没必要参杂那么多没意义的内容
今天加班,午休 up

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/624528

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX