JRE的rt.jar中提供了一个类sun.misc.Unsafe,虽然这个类因为其不其安全性,不建议使用,而且被加了诸多限制;但
是在很多场合下我们确实需要这个类提供的强大功能。JDK类库下的NIO和concurrent包下的很多类都使用到了Unsafe
类,如AtomicInteger和AbstractQueuedSynchronizer等。
JDK源码中对这个类进行了严格限制,我们不能通过常规new的方式去获取该类的实例,也不能通过Unsafe.getUnsafe
()来获取实例。但是我们可以通过反射,在我们的应用代码中获取Unsafe类的实例:
public static Unsafe getUnsafeInstance() throws Exception { // 通过反射获取rt.jar下的Unsafe类 Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafeInstance.setAccessible(true); // return (Unsafe) theUnsafeInstance.get(null);是等价的 return (Unsafe) theUnsafeInstance.get(Unsafe.class); }
在eclipse编写完这个函数之后,会出现错误或者警告提示:Access restriction: The type Unsafe is not accessible
due to restriction on required library C:\Program Files\Java\jdk1.6.0_32\jre\lib\rt.jar。
虽然这段代码在eclipse里面会报经过或者报错,但它的却是可以运行的。我们可以在eclipse进行如下设置,来取消警
告或错误:Window-->Preferences-->Java-->Compiler-->Errors/Warnings,将里面的Deprecated and restricted API中
的Forbidden references(access rules)设置成Ignore,这样eclipse就不会再报警告或者错误了。
ja获取Unsafe类的实例和取消eclipse编译的错误和警告,布布扣,bubuko.com
时间: 2024-10-12 13:42:24