Java 方法怎么把 class 类型作为参数?

2020-07-30 22:34:32 +08:00
 selfcreditgiving

想实现一个功能,打印出一个 Class 所有属性。

类似下面这样,但 IDEA 提示好像不能传 class 类型的参数。

class Aaa {
    public static final String FOO = "foo";
    public static final String BAR = "bar";
}



public void printAllProps(Class c) {
    Field[] fields = null;

    fields = Aaa.class.getDeclaredFields();
    for (Field field : fields) {
        try {
            System.out.println(String.format("name: %s value: %s", field.getName(), String.valueOf(field.get(c))));
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

或者这样不行的话,这种需求在 java 中该怎么实现呢。

3893 次点击
所在节点    Java
14 条回复
zapper
2020-07-30 22:45:14 +08:00
```
@Test
public void test(){
printAllProps(Aaa.class);
}

public void printAllProps(Class c) {
Field[] fields;

fields = c.getDeclaredFields();
for (Field field : fields) {
try {
System.out.println(String.format("name: %s value: %s", field.getName(), String.valueOf(field.get(c))));
} catch (IllegalAccessException e) {
e.printStackTrace();
}

}
}
```

输出
```
name: FOO value: foo
name: BAR value: bar
```
mmdsun
2020-07-30 22:48:59 +08:00
你传的 class 对象实列吧。传 Aaa.class 不行么。

或者
函数参数 object 也可以吧。再或者封装类似 Class<T> 的泛型?
printAllProps(Object object)
Class<?> clazz = object.getClass();
selfcreditgiving
2020-07-30 22:57:26 +08:00
@zapper #1 这样写可以执行嘛, @Test 代表什么, 加一个这个就可以了啊。 我试一下执行还是出错了。

![]( http://110.43.46.136:3000/upload/WX20200730-225521@2x_M3dBmHipD.png)
selfcreditgiving
2020-07-30 22:58:32 +08:00
对了, 我的 java 版本是 1.8
zsdroid
2020-07-30 23:13:39 +08:00
先学 java 语法吧
zsdroid
2020-07-30 23:17:54 +08:00
printAllProps(Aaa.class);要放在方法里调用
zsdroid
2020-07-30 23:18:52 +08:00
public void printAllProps(Class c) {}方法的定义要放在类里面
zsdroid
2020-07-30 23:21:08 +08:00
你细细品品下面 2 者的区别
```
class Aaa {
public static final String FOO = "foo";
public static final String BAR = "bar";
}
public void printAllProps(Class c) {
//coding
}
```

```
class Aaa {
public static final String FOO = "foo";
public static final String BAR = "bar";

public void printAllProps(Class c) {
//coding
}
}
```
zapper
2020-07-30 23:22:06 +08:00
@selfcreditgiving 呃……不要在意 @Test,@Test 是一个注解。告诉你是测试代码而已。
你不能在方法体外调用方法。至于 88 行为什么会报错,我也不清楚,不过看起来你的代码缩进不太正常。
selfcreditgiving
2020-07-30 23:31:52 +08:00
@zapper #9 好像是位置写的不对了

![]( http://110.43.46.136:3000/upload/WX20200730-232944@2x_wWTH6OiKs.png)
zsdroid
2020-07-30 23:41:04 +08:00
selfcreditgiving
2020-07-31 00:04:40 +08:00
@zapper @zsdroid @mmdsun 非常感谢,这样写就成功了

![]( http://110.43.46.136:3000/upload/WX20200731-000244@2x_WstUEx0aS.png)
wiix
2020-07-31 00:20:06 +08:00
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
xuanbg
2020-07-31 09:04:55 +08:00
楼主你这个需求用泛型就解决了。

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

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

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

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

© 2021 V2EX