Java反射获取属性

import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static class Parent {
        public String name;
        public Parent() {
            name = "hulefei";
        }
    }

    public static class Entity extends  Parent {

        public int age;
        public boolean sex;
        public String head;
        public ArrayList<String> list;
        public Entity() {
            age = 10;
            list = new ArrayList<String>();
            list.add("aaaaa");
        }
    }

    public static void main(String[] args) {
        Map map = new HashMap();
        Entity entity = new Entity();
        Field[] fields = entity.getClass().getSuperclass().getDeclaredFields();
        for(int i = 0 , len = fields.length; i < len; i++) {
            String varName = fields[i].getName();
            try {
                // 获取原来的访问控制权限
                boolean accessFlag = fields[i].isAccessible();
                // 修改访问控制权限
                fields[i].setAccessible(true);
                // 获取在对象f中属性fields[i]对应的对象中的变量
                Object o = fields[i].get(entity);
                System.out.println("传入的对象中包含一个如下的变量:" + varName +  " = " + o);
                // 恢复访问控制权限
                fields[i].setAccessible(accessFlag);
            } catch (IllegalArgumentException ex) {
                ex.printStackTrace();
            } catch (IllegalAccessException ex) {
                ex.printStackTrace();
            }
        }
        System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX")
                .format(new Date()));

    }
}

 

### 使用Java反射机制获取对象属性的数据类型 为了展示如何通过Java反射机制获得对象字段(即属性)的数据类型,下面提供了一个具体的例子。假设有一个名为`Person`的类,其中定义了一些基本类型的字段。 ```java import java.lang.reflect.Field; public class Person { private String name; private int age; private boolean married; // Constructor, getters and setters are omitted for brevity. } public class ReflectionDemo { public static void main(String[] args) throws IllegalAccessException { try { Class<?> personClass = Class.forName("Person"); Field[] fields = personClass.getDeclaredFields(); for (Field field : fields) { System.out.println("Field Name: " + field.getName()); System.out.println("Type of this field is: " + field.getType().getSimpleName()); // If needed to access non-public members like here, // make them accessible first before getting or setting values. if (!field.isAccessible()) { field.setAccessible(true); } Object value = field.get(null); // This would only work with static fields as null reference cannot be used otherwise // For demonstration purposes, printing out what was retrieved even though it will likely throw an exception due to not being set yet. System.out.println("Value found within the field: " + value); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } } ``` 上述代码片段展示了怎样遍历给定类的所有声明字段,并打印出它们的名字以及对应的简单数据类型名称[^1]。需要注意的是,在尝试访问私有成员变量之前应当调用`setAccessible(true)`方法使其可被外部程序读取或修改;另外,当试图从实例化对象之外的地方读取非静态字段时会抛出异常,因为此时并没有指定特定的对象实例作为上下文环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值