找不到com.sun.beans.introspect.PropertyInfo的类文件

maven编译项目出现这种错误时,看看自己的项目设置的jdk版本是什么,例如:JAVA_HOME环境变量对应的jdk版本:

比如我本地是JDK 18,还不是oracle jvm,这个jdk应该缺些内容。

更好本地的1.8的jdk:

set java_home=D:\apps\Java\jdk1.8.0_333\ 

 重新mvn install成功:

在使用 IntelliJ IDEA 打包(如构建 jar 包)时遇到错误: ``` 无法访问 com.sun.beans.introspect.PropertyInfo ``` 这个问题与你在代码中使用了 **JDK 内部 API** 有关,具体是 `com.sun.beans.introspect.PropertyInfo`,它是 Sun/Oracle JDK 的私有实现类。从 Java 9 开始,随着模块化系统(JPMS)的引入,这些内部类默认不再对开发者开放访问权限。 --- ### 🔍 错误原因 你可能在项目中直接或间接地引用了如下类: ```java import com.sun.beans.introspect.PropertyInfo; ``` 这类类不属于标准 Java SE API,属于 JVM 实现细节,因此: - 不保证跨版本兼容性 - 在 Java 9+ 中默认不可见 - 使用 `javac` 或打包工具编译时会报错 --- ### ✅ 推荐解决方案:使用官方支持的替代方案 #### ✔ 替代方式一:使用 Java 标准 API 获取 Bean 属性信息 你可以使用 Java 提供的标准类 `java.beans.Introspector` 和 `PropertyDescriptor` 来获取 Java Bean 的属性信息。 ##### 示例代码: ```java import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; public class BeanPropertyExample { public static void main(String[] args) throws Exception { // 获取 BeanInfo BeanInfo beanInfo = Introspector.getBeanInfo(Person.class); // 获取所有属性描述符 PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor pd : propertyDescriptors) { System.out.println("Property Name: " + pd.getName()); System.out.println("Property Type: " + pd.getPropertyType()); System.out.println("Read Method: " + pd.getReadMethod()); System.out.println("Write Method: " + pd.getWriteMethod()); System.out.println("-----------------------------"); } } } class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } ``` --- #### ✔ 替代方式二:使用 Spring Framework 的 `BeanWrapper` 如果你是在 Spring 项目中操作 Bean,可以使用 `BeanWrapper`: ```java import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; public class SpringBeanExample { public static void main(String[] args) { Person person = new Person(); BeanWrapper wrapper = new BeanWrapperImpl(person); wrapper.setPropertyValue("name", "Alice"); wrapper.setPropertyValue("age", 25); System.out.println(wrapper.getPropertyValue("name")); System.out.println(wrapper.getPropertyValue("age")); } } ``` --- #### ✔ 替代方式三:使用 Apache Commons BeanUtils 添加 Maven 依赖: ```xml <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.4</version> </dependency> ``` 使用示例: ```java import org.apache.commons.beanutils.BeanMap; public class BeanUtilsExample { public static void main(String[] args) { Person person = new Person(); BeanMap beanMap = new BeanMap(person); beanMap.put("name", "Bob"); beanMap.put("age", 30); System.out.println(beanMap.get("name")); System.out.println(beanMap.get("age")); } } ``` --- ### ⚠️ ❌ 强烈不推荐的做法:强行使用 JDK 内部类 如果你确实需要保留原有逻辑,并且明确知道后果,可以通过命令行参数让 JVM 允许访问这些内部类(仅限临时测试): ```bash --add-opens java.desktop/java.beans.introspect=ALL-UNNAMED ``` 例如使用 `javac` 编译时: ```bash javac --add-opens java.desktop/java.beans.introspect=ALL-UNNAMED YourClass.java ``` 或者在运行时加上: ```bash java --add-opens java.desktop/java.beans.introspect=ALL-UNNAMED -jar yourapp.jar ``` 但这种方式存在严重兼容性问题,不建议用于生产环境。 --- ### 🛠 IDEA 打包配置注意事项 如果你使用的是 IntelliJ IDEA 的 Artifacts 功能进行打包,请确保: 1. **你的代码没有使用任何非标准库** 2. **依赖项正确导入并打包进 jar** 3. 如果你用 Maven 或 Gradle 构建,请检查 `pom.xml` 或 `build.gradle` 文件是否包含必要的依赖(如上面提到的 Spring 或 Apache Commons) --- ### ✅ 总结对比 | 方式 | 是否推荐 | 说明 | |------|----------|------| | `com.sun.beans.introspect.PropertyInfo` | ❌ 不推荐 | 非公开API,Java 9+不可用 | | `java.beans.Introspector` | ✅ 推荐 | 标准 Java API,适合大多数场景 | | Spring `BeanWrapper` | ✅ 推荐 | 在 Spring 项目中非常方便 | | Apache Commons BeanUtils | ✅ 推荐 | 简化操作,适用于非 Spring 项目 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值