java中某个类实例.getClass().getName()取得的类名字,用split(".")分割后,获取不到分割后的数组

本文介绍了一种处理字符串中特殊字符的有效方法,特别是如何在需要分割包含点号的字符串时,正确地使用转义字符,避免常见错误。通过实例演示了在编程中遇到此类问题时的解决方案。

该方法返回类似"xx.xx.xx"的结构

不能直接这样split("."),需要将点进行转义,转义后:split("\\.")

### Java 反射的常见使用场景 Java 反射是一种强大的功能,能够在运行时动态操作、方法和字段。以下是几个常见的使用场景及其示例: #### 1. 动态加载并实例化对象 反射可以在运行时根据字符串形式的名来加载,并创建其对象。这种能力常用于插件架构或模块化的应用程序设计。 ```java // 示例:通过反射动态加载并创建实例 String className = "com.example.MyClass"; try { Class<?> clazz = Class.forName(className); Object instance = clazz.getDeclaredConstructor().newInstance(); } catch (Exception e) { e.printStackTrace(); } ``` 此代码片段展示了如何利用 `Class.forName` 方法加载指定,并通过 `getDeclaredConstructor()` 创建其实例[^1]。 #### 2. 调用私有方法或访问私有字段 即使某些方法或字段被声明为私有,也可以借助反射绕过这些限制进行访问。这在调试工具或测试框架中非常有用。 ```java // 示例:调用私有方法 Class<?> clazz = MyClass.class; Method privateMethod = clazz.getDeclaredMethod("privateMethod", null); privateMethod.setAccessible(true); // 打开权限 Object result = privateMethod.invoke(clazz.newInstance(), null); ``` 上述例子说明了如何找到目标中的特定方法并通过设置可访问标志 (`setAccessible`) 来执行它[^4]。 #### 3. 实现通用型数据绑定(如 ORM) ORM(对象关系映射)库通常会依赖于反射技术完成数据库记录到实体对象之间的转换工作。比如 Hibernate 或 MyBatis 都广泛采用了此做法。 ```java public void bindData(ResultSet rs, List<Object> list) throws Exception{ while(rs.next()){ User user=new User(); Field[] fields=user.getClass().getDeclaredFields(); for(Field f:fields){ f.setAccessible(true); String fieldName=f.getName(); try{ Method getter=rs.getClass().getMethod("getString", String.class); Object value=getter.invoke(rs,fieldName); if(value!=null && !value.equals("")) f.set(user,value); }catch(Exception ex){} } list.add(user); } } ``` 这里展示了一个简化版的数据绑定过程,其中涉及到了对 ResultSet 和 Entity 之间属性的一一对应赋值操作[^3]。 #### 4. 序列化与反序列化支持 当需要保存某个复杂结构的对象状态以便稍后恢复时,可以考虑采用基于反射的方式来进行自定义序列化逻辑编写。 ```java public String serialize(Object obj) throws IllegalAccessException { Class<?> clazz = obj.getClass(); StringBuilder sb = new StringBuilder(); for (Field field : clazz.getDeclaredFields()) { field.setAccessible(true); sb.append(field.getName()).append(": ").append(field.get(obj)).append(","); } return sb.toString(); } public Object deserialize(String str, Class<?> clazz) throws InstantiationException, IllegalAccessException { Object obj = clazz.newInstance(); String[] parts=str.split(","); int i=0; for (Field field :clazz.getDeclaredFields()){ field.setAccessible(true); if(i<parts.length){ String val=parts[i].split(":")[1]; field.set(obj,val.trim()); i++; } } return obj; } ``` 以上两个函数分别实现了基本的对象序列化和反序列化流程[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值