geforkt von Mirrors/FastAsyncWorldEdit
Merge branch '1.15' of https://github.com/IntellectualSites/FastAsyncWorldEdit-1.13 into 1.15
Dieser Commit ist enthalten in:
Commit
50c19f5a1c
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -15,4 +15,4 @@ You can do so here: https://github.com/IntellectualSites/FastAsyncWorldEdit-1.13
|
|||||||
- [] I included all information required in the sections above
|
- [] I included all information required in the sections above
|
||||||
- [] I tested my changes and approved their functionality
|
- [] I tested my changes and approved their functionality
|
||||||
- [] I ensured my changes do not break other parts of the code
|
- [] I ensured my changes do not break other parts of the code
|
||||||
- [] I read and followed the [contribution guidelines](https://github.com/IntellectualSites/FastAsyncWorldEdit-1.13/blob/breaking/CONTRIBUTING.md)
|
- [] I read and followed the [contribution guidelines](https://github.com/IntellectualSites/FastAsyncWorldEdit-1.13/blob/1.15/CONTRIBUTING.md)
|
||||||
|
4
.github/workflows/gradle.yml
vendored
4
.github/workflows/gradle.yml
vendored
@ -3,13 +3,9 @@ name: Java CI
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- master
|
|
||||||
- merge
|
|
||||||
- 1.15
|
- 1.15
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- master
|
|
||||||
- merge
|
|
||||||
- 1.15
|
- 1.15
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
69
CONTRIBUTING.md
Normale Datei
69
CONTRIBUTING.md
Normale Datei
@ -0,0 +1,69 @@
|
|||||||
|
Contributing
|
||||||
|
============
|
||||||
|
|
||||||
|
Thank you for your interest in contributing to FastAsyncWorldEdit! We appreciate your
|
||||||
|
effort, but to make sure that the inclusion of your patch is a smooth process, we
|
||||||
|
ask that you make note of the following guidelines.
|
||||||
|
|
||||||
|
* **Follow the [Oracle coding conventions](http://www.oracle.com/technetwork/java/codeconv-138413.html).**
|
||||||
|
We can't stress this enough; if your code has notable issues, it may delay
|
||||||
|
the process significantly.
|
||||||
|
* **Target Java 8 for source and compilation.** Make sure to mark methods with
|
||||||
|
` @Override` that override methods of parent classes, or that implement
|
||||||
|
methods of interfaces.
|
||||||
|
* **Use only spaces for indentation.** Our indents are 4-spaces long, and tabs
|
||||||
|
are unacceptable.
|
||||||
|
* **Wrap code to a 120 column limit.** We do this to make side by side diffs
|
||||||
|
and other such tasks easier. Ignore this guideline if it makes the code
|
||||||
|
too unreadable.
|
||||||
|
* **Write complete Javadocs.** Do so only for public methods, and make sure
|
||||||
|
that your `@param` and `@return` fields are not just blank.
|
||||||
|
* **Don't tag classes with @author.** Some legacy classes may have this tag,
|
||||||
|
but we are phasing it out.
|
||||||
|
* **Make sure the code is efficient.** One way you can achieve this is to spend
|
||||||
|
around ten minutes to think about what the code is doing and whether it
|
||||||
|
seems awfully roundabout. If you had to copy the same large piece of
|
||||||
|
code in several places, that's bad.
|
||||||
|
* **Keep commit summaries under 70 characters.** For more details, place two
|
||||||
|
new lines after the summary line and write away!
|
||||||
|
* **Test your code.** We're not interested in broken code, for the obvious reasons.
|
||||||
|
* **Write unit tests.** While this is strictly optional, we recommend it for
|
||||||
|
complicated algorithms.
|
||||||
|
|
||||||
|
|
||||||
|
Checklist
|
||||||
|
---------
|
||||||
|
|
||||||
|
Ready to submit? Perform the checklist below:
|
||||||
|
|
||||||
|
1. Have all tabs been replaced into four spaces? Are indentations 4-space wide?
|
||||||
|
2. Have I written proper Javadocs for my public methods? Are the @param and
|
||||||
|
@return fields actually filled out?
|
||||||
|
3. Have I `git rebase`d my pull request to the latest commit of the target
|
||||||
|
branch?
|
||||||
|
4. Have I combined my commits into a reasonably small number (if not one)
|
||||||
|
commit using `git rebase`?
|
||||||
|
5. Have I made my pull request too large? Pull requests should introduce
|
||||||
|
small sets of changes at a time. Major changes should be discussed with
|
||||||
|
the team prior to starting work.
|
||||||
|
6. Are my commit messages descriptive?
|
||||||
|
|
||||||
|
You should be aware of `git rebase`.
|
||||||
|
It allows you to modify existing commit messages, and combine, break apart, or
|
||||||
|
adjust past changes.
|
||||||
|
|
||||||
|
Example
|
||||||
|
-------
|
||||||
|
|
||||||
|
This is **GOOD:**
|
||||||
|
|
||||||
|
if (var.func(param1, param2)) {
|
||||||
|
// do things
|
||||||
|
}
|
||||||
|
|
||||||
|
This is **EXTREMELY BAD:**
|
||||||
|
|
||||||
|
if(var.func( param1, param2 ))
|
||||||
|
{
|
||||||
|
// do things
|
||||||
|
}
|
@ -15,12 +15,11 @@ FAWE is a fork of WorldEdit that has huge speed and memory improvements and cons
|
|||||||
|
|
||||||
## Downloads
|
## Downloads
|
||||||
### 1.13+
|
### 1.13+
|
||||||
* [Download](https://empcraft.com/fawe/download/)
|
* [Download](https://intellectualsites.github.io/download/fawe.html)
|
||||||
* [Jenkins](https://ci.athion.net/job/FastAsyncWorldEdit-Breaking/)
|
* [Jenkins](https://ci.athion.net/job/FastAsyncWorldEdit-1.15/)
|
||||||
* [JavaDoc](https://ci.athion.net/job/FastAsyncWorldEdit-1.13/javadoc/)
|
|
||||||
|
|
||||||
### < 1.12.2
|
### < 1.12.2
|
||||||
* [Download](https://empcraft.com/fawe/download/?bukkit)
|
* [Download](https://intellectualsites.github.io/download/fawe.html)
|
||||||
* [Jenkins](https://ci.athion.net/job/FastAsyncWorldEdit/)
|
* [Jenkins](https://ci.athion.net/job/FastAsyncWorldEdit/)
|
||||||
* [Repository](https://github.com/boy0001/FastAsyncWorldedit)
|
* [Repository](https://github.com/boy0001/FastAsyncWorldedit)
|
||||||
* [JavaDoc](https://ci.athion.net/job/FastAsyncWorldEdit/javadoc/)
|
* [JavaDoc](https://ci.athion.net/job/FastAsyncWorldEdit/javadoc/)
|
||||||
|
@ -7,6 +7,7 @@ import com.boydti.fawe.bukkit.adapter.NMSAdapter;
|
|||||||
import com.boydti.fawe.config.Settings;
|
import com.boydti.fawe.config.Settings;
|
||||||
import com.boydti.fawe.object.collection.BitArray4096;
|
import com.boydti.fawe.object.collection.BitArray4096;
|
||||||
import com.boydti.fawe.util.MathMan;
|
import com.boydti.fawe.util.MathMan;
|
||||||
|
import com.boydti.fawe.util.ReflectionUtils;
|
||||||
import com.boydti.fawe.util.TaskManager;
|
import com.boydti.fawe.util.TaskManager;
|
||||||
import com.sk89q.worldedit.world.block.BlockState;
|
import com.sk89q.worldedit.world.block.BlockState;
|
||||||
import com.sk89q.worldedit.world.block.BlockTypesCache;
|
import com.sk89q.worldedit.world.block.BlockTypesCache;
|
||||||
@ -83,11 +84,7 @@ public final class BukkitAdapter_1_13 extends NMSAdapter {
|
|||||||
} catch (NoSuchFieldException paper) {
|
} catch (NoSuchFieldException paper) {
|
||||||
tmp = DataPaletteBlock.class.getDeclaredField("j");
|
tmp = DataPaletteBlock.class.getDeclaredField("j");
|
||||||
}
|
}
|
||||||
Field modifiersField = Field.class.getDeclaredField("modifiers");
|
ReflectionUtils.setAccessibleNonFinal(tmp);
|
||||||
modifiersField.setAccessible(true);
|
|
||||||
int modifiers = modifiersField.getInt(tmp);
|
|
||||||
int newModifiers = modifiers & (~Modifier.FINAL);
|
|
||||||
if (newModifiers != modifiers) modifiersField.setInt(tmp, newModifiers);
|
|
||||||
fieldLock = tmp;
|
fieldLock = tmp;
|
||||||
fieldLock.setAccessible(true);
|
fieldLock.setAccessible(true);
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ import com.boydti.fawe.bukkit.adapter.DelegateLock;
|
|||||||
import com.boydti.fawe.config.Settings;
|
import com.boydti.fawe.config.Settings;
|
||||||
import com.boydti.fawe.object.collection.BitArray4096;
|
import com.boydti.fawe.object.collection.BitArray4096;
|
||||||
import com.boydti.fawe.util.MathMan;
|
import com.boydti.fawe.util.MathMan;
|
||||||
|
import com.boydti.fawe.util.ReflectionUtils;
|
||||||
import com.boydti.fawe.util.TaskManager;
|
import com.boydti.fawe.util.TaskManager;
|
||||||
import com.sk89q.worldedit.world.block.BlockState;
|
import com.sk89q.worldedit.world.block.BlockState;
|
||||||
import com.sk89q.worldedit.world.block.BlockTypesCache;
|
import com.sk89q.worldedit.world.block.BlockTypesCache;
|
||||||
@ -83,11 +84,7 @@ public final class BukkitAdapter_1_14 extends NMSAdapter {
|
|||||||
} catch (NoSuchFieldException paper) {
|
} catch (NoSuchFieldException paper) {
|
||||||
tmp = DataPaletteBlock.class.getDeclaredField("j");
|
tmp = DataPaletteBlock.class.getDeclaredField("j");
|
||||||
}
|
}
|
||||||
Field modifiersField = Field.class.getDeclaredField("modifiers");
|
ReflectionUtils.setAccessibleNonFinal(tmp);
|
||||||
modifiersField.setAccessible(true);
|
|
||||||
int modifiers = modifiersField.getInt(tmp);
|
|
||||||
int newModifiers = modifiers & (~Modifier.FINAL);
|
|
||||||
if (newModifiers != modifiers) modifiersField.setInt(tmp, newModifiers);
|
|
||||||
fieldLock = tmp;
|
fieldLock = tmp;
|
||||||
fieldLock.setAccessible(true);
|
fieldLock.setAccessible(true);
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ import com.boydti.fawe.bukkit.adapter.NMSAdapter;
|
|||||||
import com.boydti.fawe.config.Settings;
|
import com.boydti.fawe.config.Settings;
|
||||||
import com.boydti.fawe.object.collection.BitArray4096;
|
import com.boydti.fawe.object.collection.BitArray4096;
|
||||||
import com.boydti.fawe.util.MathMan;
|
import com.boydti.fawe.util.MathMan;
|
||||||
|
import com.boydti.fawe.util.ReflectionUtils;
|
||||||
import com.boydti.fawe.util.TaskManager;
|
import com.boydti.fawe.util.TaskManager;
|
||||||
import com.sk89q.worldedit.world.block.BlockState;
|
import com.sk89q.worldedit.world.block.BlockState;
|
||||||
import com.sk89q.worldedit.world.block.BlockTypesCache;
|
import com.sk89q.worldedit.world.block.BlockTypesCache;
|
||||||
@ -18,7 +19,6 @@ import org.bukkit.craftbukkit.v1_15_R1.CraftWorld;
|
|||||||
import sun.misc.Unsafe;
|
import sun.misc.Unsafe;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Modifier;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.locks.Lock;
|
import java.util.concurrent.locks.Lock;
|
||||||
@ -66,11 +66,7 @@ public final class BukkitAdapter_1_15 extends NMSAdapter {
|
|||||||
fieldDirtyBits.setAccessible(true);
|
fieldDirtyBits.setAccessible(true);
|
||||||
|
|
||||||
Field tmp = DataPaletteBlock.class.getDeclaredField("j");
|
Field tmp = DataPaletteBlock.class.getDeclaredField("j");
|
||||||
Field modifiersField = Field.class.getDeclaredField("modifiers");
|
ReflectionUtils.setAccessibleNonFinal(tmp);
|
||||||
modifiersField.setAccessible(true);
|
|
||||||
int modifiers = modifiersField.getInt(tmp);
|
|
||||||
int newModifiers = modifiers & (~Modifier.FINAL);
|
|
||||||
if (newModifiers != modifiers) modifiersField.setInt(tmp, newModifiers);
|
|
||||||
fieldLock = tmp;
|
fieldLock = tmp;
|
||||||
fieldLock.setAccessible(true);
|
fieldLock.setAccessible(true);
|
||||||
|
|
||||||
|
@ -141,7 +141,7 @@ public class LocalBlockVector2DSet implements Set<BlockVector2> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object[] toArray() {
|
public Object[] toArray() {
|
||||||
return toArray(null);
|
return toArray((Object[]) null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -160,7 +160,7 @@ public class LocalBlockVectorSet implements Set<BlockVector3> {
|
|||||||
|
|
||||||
@NotNull @Override
|
@NotNull @Override
|
||||||
public Object[] toArray() {
|
public Object[] toArray() {
|
||||||
return toArray(null);
|
return toArray((Object[]) null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull @Override
|
@NotNull @Override
|
||||||
|
@ -96,9 +96,8 @@ public class ReflectionUtils {
|
|||||||
return ReflectionFactory.getReflectionFactory().newConstructorAccessor(enumClass.getDeclaredConstructor(parameterTypes));
|
return ReflectionFactory.getReflectionFactory().newConstructorAccessor(enumClass.getDeclaredConstructor(parameterTypes));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setFailsafeFieldValue(Field field, Object target, Object value)
|
public static void setAccessibleNonFinal(Field field)
|
||||||
throws NoSuchFieldException, IllegalAccessException {
|
throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
|
||||||
|
|
||||||
// let's make the field accessible
|
// let's make the field accessible
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
|
|
||||||
@ -106,6 +105,7 @@ public class ReflectionUtils {
|
|||||||
// not be final anymore, thus tricking reflection into
|
// not be final anymore, thus tricking reflection into
|
||||||
// letting us modify the static final field
|
// letting us modify the static final field
|
||||||
if (Modifier.isFinal(field.getModifiers())) {
|
if (Modifier.isFinal(field.getModifiers())) {
|
||||||
|
try {
|
||||||
Field modifiersField = Field.class.getDeclaredField("modifiers");
|
Field modifiersField = Field.class.getDeclaredField("modifiers");
|
||||||
modifiersField.setAccessible(true);
|
modifiersField.setAccessible(true);
|
||||||
int modifiers = modifiersField.getInt(field);
|
int modifiers = modifiersField.getInt(field);
|
||||||
@ -113,8 +113,27 @@ public class ReflectionUtils {
|
|||||||
// blank out the final bit in the modifiers int
|
// blank out the final bit in the modifiers int
|
||||||
modifiers &= ~Modifier.FINAL;
|
modifiers &= ~Modifier.FINAL;
|
||||||
modifiersField.setInt(field, modifiers);
|
modifiersField.setInt(field, modifiers);
|
||||||
|
} catch (NoSuchFieldException e) {
|
||||||
|
// Java 12+ compatibility - search fields with hidden method for modifiers
|
||||||
|
// same concept as above, just with a more hacky way of getting to the modifiers
|
||||||
|
Method getDeclaredFields0 = Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class);
|
||||||
|
getDeclaredFields0.setAccessible(true);
|
||||||
|
Field[] fields = (Field[]) getDeclaredFields0.invoke(Field.class, false);
|
||||||
|
for (Field classField : fields) {
|
||||||
|
if ("modifiers".equals(classField.getName())) {
|
||||||
|
classField.setAccessible(true);
|
||||||
|
classField.set(field, field.getModifiers() & ~Modifier.FINAL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void setFailsafeFieldValue(Field field, Object target, Object value)
|
||||||
|
throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
|
||||||
|
|
||||||
|
setAccessibleNonFinal(field);
|
||||||
try {
|
try {
|
||||||
FieldAccessor fa = ReflectionFactory.getReflectionFactory().newFieldAccessor(field, false);
|
FieldAccessor fa = ReflectionFactory.getReflectionFactory().newFieldAccessor(field, false);
|
||||||
fa.set(target, value);
|
fa.set(target, value);
|
||||||
@ -124,7 +143,7 @@ public class ReflectionUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void blankField(Class<?> enumClass, String fieldName)
|
private static void blankField(Class<?> enumClass, String fieldName)
|
||||||
throws NoSuchFieldException, IllegalAccessException {
|
throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
|
||||||
for (Field field : Class.class.getDeclaredFields()) {
|
for (Field field : Class.class.getDeclaredFields()) {
|
||||||
if (field.getName().contains(fieldName)) {
|
if (field.getName().contains(fieldName)) {
|
||||||
AccessibleObject.setAccessible(new Field[]{field}, true);
|
AccessibleObject.setAccessible(new Field[]{field}, true);
|
||||||
@ -134,8 +153,8 @@ public class ReflectionUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void cleanEnumCache(Class<?> enumClass)
|
static void cleanEnumCache(Class<?> enumClass)
|
||||||
throws NoSuchFieldException, IllegalAccessException {
|
throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
|
||||||
blankField(enumClass, "enumConstantDirectory"); // Sun (Oracle?!?) JDK 1.5/6
|
blankField(enumClass, "enumConstantDirectory"); // Sun (Oracle?!?) JDK 1.5/6
|
||||||
blankField(enumClass, "enumConstants"); // IBM JDK
|
blankField(enumClass, "enumConstants"); // IBM JDK
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,10 @@ package com.boydti.fawe.util;
|
|||||||
|
|
||||||
import sun.misc.Unsafe;
|
import sun.misc.Unsafe;
|
||||||
|
|
||||||
import java.lang.reflect.*;
|
import java.lang.reflect.AccessibleObject;
|
||||||
|
import java.lang.reflect.Array;
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -41,15 +44,15 @@ public class ReflectionUtils9 {
|
|||||||
|
|
||||||
// 5. Set new values field
|
// 5. Set new values field
|
||||||
try {
|
try {
|
||||||
setFailsafeFieldValue(valuesField, null,
|
ReflectionUtils.setFailsafeFieldValue(valuesField, null,
|
||||||
values.toArray((T[]) Array.newInstance(enumType, 0)));
|
values.toArray((T[]) Array.newInstance(enumType, 0)));
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Field ordinalField = Enum.class.getDeclaredField("ordinal");
|
Field ordinalField = Enum.class.getDeclaredField("ordinal");
|
||||||
setFailsafeFieldValue(ordinalField, newValue, 0);
|
ReflectionUtils.setFailsafeFieldValue(ordinalField, newValue, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 6. Clean enum cache
|
// 6. Clean enum cache
|
||||||
cleanEnumCache(enumType);
|
ReflectionUtils.cleanEnumCache(enumType);
|
||||||
return newValue;
|
return newValue;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -64,55 +67,11 @@ public class ReflectionUtils9 {
|
|||||||
Object instance = unsafe.allocateInstance(enumClass);
|
Object instance = unsafe.allocateInstance(enumClass);
|
||||||
|
|
||||||
Field ordinalField = Enum.class.getDeclaredField("ordinal");
|
Field ordinalField = Enum.class.getDeclaredField("ordinal");
|
||||||
setFailsafeFieldValue(ordinalField, instance, 0);
|
ReflectionUtils.setFailsafeFieldValue(ordinalField, instance, 0);
|
||||||
|
|
||||||
Field nameField = Enum.class.getDeclaredField("name");
|
Field nameField = Enum.class.getDeclaredField("name");
|
||||||
setFailsafeFieldValue(nameField, instance, value);
|
ReflectionUtils.setFailsafeFieldValue(nameField, instance, value);
|
||||||
|
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setFailsafeFieldValue(Field field, Object target, Object value)
|
|
||||||
throws NoSuchFieldException, IllegalAccessException {
|
|
||||||
|
|
||||||
// let's make the field accessible
|
|
||||||
field.setAccessible(true);
|
|
||||||
|
|
||||||
// next we change the modifier in the Field instance to
|
|
||||||
// not be final anymore, thus tricking reflection into
|
|
||||||
// letting us modify the static final field
|
|
||||||
if (Modifier.isFinal(field.getModifiers())) {
|
|
||||||
Field modifiersField = Field.class.getDeclaredField("modifiers");
|
|
||||||
modifiersField.setAccessible(true);
|
|
||||||
int modifiers = modifiersField.getInt(field);
|
|
||||||
|
|
||||||
// blank out the final bit in the modifiers int
|
|
||||||
modifiers &= ~Modifier.FINAL;
|
|
||||||
modifiersField.setInt(field, modifiers);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (target == null) field.set(null, value);
|
|
||||||
else field.set(target, value);
|
|
||||||
} catch (NoSuchMethodError error) {
|
|
||||||
field.set(target, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void blankField(Class<?> enumClass, String fieldName)
|
|
||||||
throws NoSuchFieldException, IllegalAccessException {
|
|
||||||
for (Field field : Class.class.getDeclaredFields()) {
|
|
||||||
if (field.getName().contains(fieldName)) {
|
|
||||||
AccessibleObject.setAccessible(new Field[]{field}, true);
|
|
||||||
setFailsafeFieldValue(field, enumClass, null);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void cleanEnumCache(Class<?> enumClass)
|
|
||||||
throws NoSuchFieldException, IllegalAccessException {
|
|
||||||
blankField(enumClass, "enumConstantDirectory"); // Sun (Oracle?!?) JDK 1.5/6
|
|
||||||
blankField(enumClass, "enumConstants"); // IBM JDK
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren