java 声明静态Map常量的一种简单方式

本文介绍了一种在Java中声明静态Map常量的简约方式,通过使用匿名内部类简化了初始化过程。此外,还展示了如何用Arrays.asList声明静态List。
 

java 声明静态Map常量的一种简单方式

标签: javahashmaplist
  5887人阅读  评论(0)  收藏  举报
  分类:
 
常用的声明方式(使用静态代码块):
[java]  view plain  copy
  1. public final static Map map = new HashMap();  
  2. static {  
  3.     map.put("key1""value1");  
  4.     map.put("key2""value2");  
  5. }  


一种简约的方式:
 
[java]  view plain  copy
  1. public final static Map map = new HashMap() {{    
  2.     put("key1""value1");    
  3.     put("key2""value2");    
  4. }};  
这种方式,相当于重载HashMap的一个匿名实现。向原有的HashMap中添加了一个匿名构造方法。 


另外附加一个List/Set变量的声明方式:
[java]  view plain  copy
  1. public final static List list = Arrays.asList("elment1""element2");    
<think> 在Java中,我们可以使用反射机制来访问类中的常量(即public static final字段)。以下是几种常用的方式: 1. 使用`Class.getField(String name)`方法获取public字段(包括常量)。 2. 使用`Class.getDeclaredField(String name)`方法获取类中声明的任意字段(包括private,但需要设置可访问性)。 3. 使用`Class.getFields()`获取所有public字段,然后遍历找到目标常量。 4. 使用`Class.getDeclaredFields()`获取所有字段(包括private),然后遍历并设置可访问性来获取常量值。 下面我将分别给出示例代码。 ### 1. 使用`Class.getField(String name)` 这种方式适用于public的常量字段。 ```java import java.lang.reflect.Field; public class ReflectConstant { public static final String CONSTANT = "Hello, Reflection!"; public static void main(String[] args) { try { // 获取Class对象 Class<?> clazz = ReflectConstant.class; // 获取指定名称的public字段(包括静态常量) Field field = clazz.getField("CONSTANT"); // 因为是静态字段,所以传入null作为参数 String value = (String) field.get(null); System.out.println("Constant value: " + value); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } } ``` ### 2. 使用`Class.getDeclaredField(String name)` 如果常量是private的,我们可以使用`getDeclaredField`并设置可访问性。 ```java import java.lang.reflect.Field; public class ReflectConstant { private static final String CONSTANT = "Hello, Private Reflection!"; public static void main(String[] args) { try { Class<?> clazz = ReflectConstant.class; Field field = clazz.getDeclaredField("CONSTANT"); // 设置可访问,否则private字段无法访问 field.setAccessible(true); String value = (String) field.get(null); System.out.println("Private constant value: " + value); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } } ``` ### 3. 使用`Class.getFields()`遍历所有public字段 当我们需要获取所有public常量时,可以遍历这些字段。 ```java import java.lang.reflect.Field; public class ReflectConstant { public static final String CONSTANT1 = "Hello"; public static final String CONSTANT2 = "World"; public static void main(String[] args) { Class<?> clazz = ReflectConstant.class; Field[] fields = clazz.getFields(); for (Field field : fields) { try { // 检查是否为静态字段(常量通常是静态的) if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) { Object value = field.get(null); System.out.println("Constant " + field.getName() + " = " + value); } } catch (IllegalAccessException e) { e.printStackTrace(); } } } } ``` ### 4. 使用`Class.getDeclaredFields()`遍历所有字段 包括非public的字段,然后通过设置可访问性来获取值。 ```java import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class ReflectConstant { public static final String CONSTANT1 = "Public"; private static final String CONSTANT2 = "Private"; public static void main(String[] args) { Class<?> clazz = ReflectConstant.class; Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { // 检查是否为static final字段(常量) int mod = field.getModifiers(); if (Modifier.isStatic(mod) && Modifier.isFinal(mod)) { try { field.setAccessible(true); Object value = field.get(null); System.out.println("Constant: " + field.getName() + " = " + value); } catch (IllegalAccessException e) { e.printStackTrace(); } } } } } ``` ### 注意事项: - 对于基本数据类型(如int, double等),使用`Field.get(null)`会返回对应的包装类型(如Integer, Double)。 - 由于常量是final的,我们不能通过反射修改它们的值(除了在反射中修改final字段的限制被放宽的情况,但这通常是不推荐且不安全的)。 以上就是在Java中使用反射获取类中常量的几种方式。 §§相关问题§§: 1. 在反射中,如何修改一个被声明为final的字段的值? 2. 反射获取字段值时,如果字段是私有的,除了设置可访问性还有别的方法吗? 3. 使用反射获取静态字段和非静态字段有什么区别? 4. 反射中`getFields()`和`getDeclaredFields()`方法有什么区别? </think>在Java中,使用反射获取类中的常量(通常是 `public static final` 字段)有以下几种常用方式: ### 1. 使用 `Class.getField()` 获取公共常量 ```java import java.lang.reflect.Field; public class ReflectConstants { public static final String API_KEY = "A1B2C3"; public static void main(String[] args) { try { // 获取Class对象 Class<?> clazz = ReflectConstants.class; // 获取公共字段(仅限public) Field field = clazz.getField("API_KEY"); // 获取静态字段值(参数传null) String value = (String) field.get(null); System.out.println("API_KEY: " + value); // 输出: API_KEY: A1B2C3 } catch (Exception e) { e.printStackTrace(); } } } ``` **解释**: - `getField()` 只能获取 `public` 字段 - `field.get(null)` 用于获取静态字段值 - 适用于已知公共常量名称的场景 ### 2. 使用 `Class.getDeclaredField()` 获取任意修饰符的常量 ```java import java.lang.reflect.Field; public class ReflectConstants { private static final int MAX_SIZE = 100; public static void main(String[] args) { try { Class<?> clazz = ReflectConstants.class; // 获取任意访问权限的字段 Field field = clazz.getDeclaredField("MAX_SIZE"); // 解除私有访问限制 field.setAccessible(true); int value = (int) field.get(null); System.out.println("MAX_SIZE: " + value); // 输出: MAX_SIZE: 100 } catch (Exception e) { e.printStackTrace(); } } } ``` **解释**: - `getDeclaredField()` 可获取任意访问权限的字段 - `setAccessible(true)` 解除私有字段访问限制 - 适用于私有/受保护常量 ### 3. 批量扫描类中的所有常量 ```java import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class ReflectConstants { public static final double PI = 3.14159; private static final String SECRET = "confidential"; public static void main(String[] args) { Class<?> clazz = ReflectConstants.class; // 获取所有声明字段(包括私有) for (Field field : clazz.getDeclaredFields()) { int modifiers = field.getModifiers(); // 检查是否是static final字段 if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) { try { field.setAccessible(true); Object value = field.get(null); System.out.printf("Constant %s = %s%n", field.getName(), value); } catch (IllegalAccessException e) { e.printStackTrace(); } } } } } ``` **输出**: ``` Constant PI = 3.14159 Constant SECRET = confidential ``` **解释**: - 使用 `getDeclaredFields()` 获取所有字段 - 通过 `Modifier` 检查 `static final` 修饰符 - 自动解除访问限制并获取值 - 适合扫描类中所有常量 ### 4. 使用枚举方式处理常量类 ```java import java.lang.reflect.Field; public class AppConstants { public static final String ENV = "production"; public static final int TIMEOUT = 30; // 防止实例化 private AppConstants() {} } class ReflectTest { public static void main(String[] args) { try { Class<?> clazz = Class.forName("AppConstants"); Field timeoutField = clazz.getDeclaredField("TIMEOUT"); int timeout = (int) timeoutField.get(null); System.out.println("Timeout: " + timeout + "s"); // 输出: Timeout: 30s } catch (Exception e) { e.printStackTrace(); } } } ``` ### 关键注意事项: 1. **访问控制**: - 私有常量需要 `setAccessible(true)` - 可能触发 `SecurityException`(受安全管理器限制) 2. **类型处理**: - 基本类型字段返回包装类(如 `int` → `Integer`) - 使用强制类型转换需确保类型匹配 3. **性能考虑**: - 反射操作比直接访问慢10-100倍 - 高频场景建议缓存 `Field` 对象 4. **最佳实践**: ```java // 使用缓存优化性能 private static final Map<String, Field> CONSTANT_CACHE = new HashMap<>(); public static Object getConstant(String name) throws Exception { Field field = CONSTANT_CACHE.get(name); if (field == null) { field = MyConstants.class.getDeclaredField(name); field.setAccessible(true); CONSTANT_CACHE.put(name, field); } return field.get(null); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值