V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
selfcreditgiving
V2EX  ›  Java

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

  •  
  •   selfcreditgiving · 2020-07-30 22:34:32 +08:00 · 4014 次点击
    这是一个创建于 1575 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想实现一个功能,打印出一个 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 中该怎么实现呢。

    14 条回复    2020-07-31 09:04:55 +08:00
    zapper
        1
    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
        2
    mmdsun  
       2020-07-30 22:48:59 +08:00 via Android   ❤️ 1
    你传的 class 对象实列吧。传 Aaa.class 不行么。

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

    ![]( http://110.43.46.136:3000/upload/WX20200730-225521@2x_M3dBmHipD.png)
    selfcreditgiving
        4
    selfcreditgiving  
    OP
       2020-07-30 22:58:32 +08:00
    对了, 我的 java 版本是 1.8
    zsdroid
        5
    zsdroid  
       2020-07-30 23:13:39 +08:00
    先学 java 语法吧
    zsdroid
        6
    zsdroid  
       2020-07-30 23:17:54 +08:00
    printAllProps(Aaa.class);要放在方法里调用
    zsdroid
        7
    zsdroid  
       2020-07-30 23:18:52 +08:00
    public void printAllProps(Class c) {}方法的定义要放在类里面
    zsdroid
        8
    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
        9
    zapper  
       2020-07-30 23:22:06 +08:00   ❤️ 1
    @selfcreditgiving 呃……不要在意 @Test,@Test 是一个注解。告诉你是测试代码而已。
    你不能在方法体外调用方法。至于 88 行为什么会报错,我也不清楚,不过看起来你的代码缩进不太正常。
    selfcreditgiving
        10
    selfcreditgiving  
    OP
       2020-07-30 23:31:52 +08:00
    @zapper #9 好像是位置写的不对了

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

    ![]( http://110.43.46.136:3000/upload/WX20200731-000244@2x_WstUEx0aS.png)
    wiix
        13
    wiix  
       2020-07-31 00:20:06 +08:00
    @Override
    public String toString() {
    return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }
    xuanbg
        14
    xuanbg  
       2020-07-31 09:04:55 +08:00
    楼主你这个需求用泛型就解决了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3326 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:49 · PVG 12:49 · LAX 20:49 · JFK 23:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.