java.lang.Byte.parseByte()方法

Java.lang.Byte.parseByte(String  s) 解析字符串参数  (该参数必须是是十进制的数字,除非第一个字符为ascll字符减号'-'('u002D')或是加号'+'('u002D')来表示正和负的数字)


函数声明

public static byte parseByte(String s)throws NumberFormatException


参数

s  表示要解析的字符串


返回值

十进制的字节(byte)值


异常

NumberFormatException - 如果字符串中不包含一个可分析的字节。


例子

package com.rocket.liang;

public class Byte_Parse {
	public static void main(String[] args) {
		byte bt1;
		byte bt2;
		
		String s1 = "+123";
		String s2 = "-123";
		
		bt1 = Byte.parseByte(s1);
		bt2 = Byte.parseByte(s2);
		
		String str1 = "解析前: "+ s1 +"解析后:"+ bt1;
		String str2 = "解析前:  "+ s2 +"解析后:"+ bt2;
		
		System.out.println(str1);
		System.out.println(str2);
	}
}

运行结果:

解析前: +123解析后:123
解析前:  -123解析后:-123


Java 9 引入模块系统(JPMS)后,对类加载器的某些受保护方法(如 `ClassLoader.defineClass`)的访问受到更严格的模块权限控制。如果尝试通过反射访问 `ClassLoader.defineClass` 方法,可能会遇到如下错误: ``` java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String, byte[], int, int, java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible ``` 或者: ``` java.base does not open java.lang to unnamed module ``` 这是由于 `java.lang` 包属于 `java.base` 模块,而该模块默认不会开放(open)给未命名模块(即应用程序类路径上的模块),从而限制了反射访问其受保护或私有成员的能力。 ### 解决方案 #### 1. 使用 `--add-opens` JVM 参数开放模块访问权限 这是最直接且推荐的解决方案。在启动 JVM 时,通过添加 `--add-opens` 参数,显式地开放模块中的包给未命名模块。 例如: ```bash java --add-opens java.base/java.lang=ALL-UNNAMED -jar your-application.jar ``` 此命令将允许未命名模块访问 `java.lang` 包中的类成员,包括受保护的 `ClassLoader.defineClass` 方法。 #### 2. 使用反射设置 `AccessibleObject.setAccessible` 并忽略模块限制(不推荐) 虽然可以通过 `setAccessible(true)` 尝试绕过访问控制,但在 Java 9 及更高版本中,如果模块未开放相应包,则仍然会抛出异常。 ```java Method defineClassMethod = ClassLoader.class.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class, ProtectionDomain.class); defineClassMethod.setAccessible(true); // 可能抛出异常 ``` 如果未使用 `--add-opens`,则可能抛出 `InaccessibleObjectException`,因为模块系统阻止了这种访问。 #### 3. 使用自定义类加载器继承并暴露 `defineClass` 另一种方法是定义一个继承自 `ClassLoader` 的子类,并在其内部暴露 `defineClass` 方法: ```java public class CustomClassLoader extends ClassLoader { public Class<?> defineMyClass(String name, byte[] b, int off, int len) { return defineClass(name, b, off, len, null); } } ``` 然后通过该子类调用: ```java CustomClassLoader loader = new CustomClassLoader(); Class<?> dynamicClass = loader.defineMyClass("com.example.DynamicClass", bytecode, 0, bytecode.length); ``` 此方法避免了反射访问受保护方法的需求,因此不会受到模块系统的限制。 --- ### 总结 - Java 模块系统限制了反射访问受保护成员的能力。 - 使用 `--add-opens` 是解决此类问题的标准做法。 - 继承 `ClassLoader` 并暴露方法是避免反射的替代方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值