diff --git a/build.xml b/build.xml
index 46937a3..fdcc328 100644
--- a/build.xml
+++ b/build.xml
@@ -67,6 +67,7 @@
+
@@ -165,6 +166,7 @@
+
diff --git a/ivy.xml b/ivy.xml
index 435c349..99cde78 100644
--- a/ivy.xml
+++ b/ivy.xml
@@ -17,7 +17,7 @@
-
+
]>
diff --git a/src/main/docs/bundled-signatures.html b/src/main/docs/bundled-signatures.html
index 64e2fc7..52f7547 100644
--- a/src/main/docs/bundled-signatures.html
+++ b/src/main/docs/bundled-signatures.html
@@ -29,14 +29,14 @@ Bundled Signatures Documentation
jdk-unsafe-*: Signatures
of "unsafe" methods that use default charset, default locale, or default timezone. For server applications it is very
stupid to call those methods, as the results will definitely not what the user wants
-(for Java * = 1.7, 1.8, 9,..., 19; Ant / Maven / Gradle automatically add the compile Java version).
+(for Java * = 1.7, 1.8, 9,..., 20; Ant / Maven / Gradle automatically add the compile Java version).
jdk-deprecated-*: This disallows all deprecated
-methods from the JDK (for Java * = 1.7, 1.8, 9,..., 19; Ant / Maven / Gradle automatically add the compile Java version).
+methods from the JDK (for Java * = 1.7, 1.8, 9,..., 20; Ant / Maven / Gradle automatically add the compile Java version).
jdk-internal-*: Lists all internal packages of the JDK as of Security.getProperty("package.access")
.
Calling those methods will always trigger security manager and is completely forbidden from Java 9 on
-(for Java * = 1.7, 1.8, 9,..., 19; Ant / Maven / Gradle automatically add the compile Java version, since forbiddenapis v2.1).
+(for Java * = 1.7, 1.8, 9,..., 20; Ant / Maven / Gradle automatically add the compile Java version, since forbiddenapis v2.1).
jdk-non-portable: Signatures of all non-portable (like com.sun.management.HotSpotDiagnosticMXBean
)
or internal runtime APIs (like sun.misc.Unsafe
). This is a superset of jdk-internal.
diff --git a/src/main/java/de/thetaphi/forbiddenapis/AsmUtils.java b/src/main/java/de/thetaphi/forbiddenapis/AsmUtils.java
index 1d07bc3..a2b8779 100644
--- a/src/main/java/de/thetaphi/forbiddenapis/AsmUtils.java
+++ b/src/main/java/de/thetaphi/forbiddenapis/AsmUtils.java
@@ -180,7 +180,7 @@ private static byte[] readStream(final InputStream in) throws IOException {
@SuppressWarnings("unused")
public static ClassReader readAndPatchClass(InputStream in) throws IOException {
final byte[] bytecode = readStream(in);
- if (false) patchClassMajorVersion(bytecode, Opcodes.V19 + 1, Opcodes.V19);
+ if (false) patchClassMajorVersion(bytecode, Opcodes.V21 + 1, Opcodes.V21);
return new ClassReader(bytecode);
}
diff --git a/src/main/resources/de/thetaphi/forbiddenapis/signatures/jdk-deprecated-20.txt b/src/main/resources/de/thetaphi/forbiddenapis/signatures/jdk-deprecated-20.txt
new file mode 100644
index 0000000..35707e3
--- /dev/null
+++ b/src/main/resources/de/thetaphi/forbiddenapis/signatures/jdk-deprecated-20.txt
@@ -0,0 +1,656 @@
+# This file contains API signatures extracted from the rt.jar / jimage file shipped with the class library of Oracle's Java Runtime Environment.
+# It is provided here for reference, but can easily regenerated by executing from the source folder of forbidden-apis:
+# $ ant generate-deprecated
+
+# This file contains all public, deprecated API signatures in Java version 20 (extracted from build 20).
+
+@ignoreUnresolvable
+@defaultMessage Deprecated in Java 20
+
+java.applet.Applet
+java.applet.AppletContext
+java.applet.AppletStub
+java.applet.AudioClip
+java.awt.AWTEvent#(java.awt.Event)
+java.awt.AWTKeyStroke#registerSubclass(java.lang.Class)
+java.awt.BorderLayout#addLayoutComponent(java.lang.String,java.awt.Component)
+java.awt.CardLayout#addLayoutComponent(java.lang.String,java.awt.Component)
+java.awt.CheckboxGroup#getCurrent()
+java.awt.CheckboxGroup#setCurrent(java.awt.Checkbox)
+java.awt.Choice#countItems()
+java.awt.Component#action(java.awt.Event,java.lang.Object)
+java.awt.Component#bounds()
+java.awt.Component#deliverEvent(java.awt.Event)
+java.awt.Component#disable()
+java.awt.Component#enable()
+java.awt.Component#enable(boolean)
+java.awt.Component#gotFocus(java.awt.Event,java.lang.Object)
+java.awt.Component#handleEvent(java.awt.Event)
+java.awt.Component#hide()
+java.awt.Component#inside(int,int)
+java.awt.Component#isFocusTraversable()
+java.awt.Component#keyDown(java.awt.Event,int)
+java.awt.Component#keyUp(java.awt.Event,int)
+java.awt.Component#layout()
+java.awt.Component#locate(int,int)
+java.awt.Component#location()
+java.awt.Component#lostFocus(java.awt.Event,java.lang.Object)
+java.awt.Component#minimumSize()
+java.awt.Component#mouseDown(java.awt.Event,int,int)
+java.awt.Component#mouseDrag(java.awt.Event,int,int)
+java.awt.Component#mouseEnter(java.awt.Event,int,int)
+java.awt.Component#mouseExit(java.awt.Event,int,int)
+java.awt.Component#mouseMove(java.awt.Event,int,int)
+java.awt.Component#mouseUp(java.awt.Event,int,int)
+java.awt.Component#move(int,int)
+java.awt.Component#nextFocus()
+java.awt.Component#postEvent(java.awt.Event)
+java.awt.Component#preferredSize()
+java.awt.Component#reshape(int,int,int,int)
+java.awt.Component#resize(int,int)
+java.awt.Component#resize(java.awt.Dimension)
+java.awt.Component#show()
+java.awt.Component#show(boolean)
+java.awt.Component#size()
+java.awt.ComponentOrientation#getOrientation(java.util.ResourceBundle)
+java.awt.Container#countComponents()
+java.awt.Container#deliverEvent(java.awt.Event)
+java.awt.Container#insets()
+java.awt.Container#layout()
+java.awt.Container#locate(int,int)
+java.awt.Container#minimumSize()
+java.awt.Container#preferredSize()
+java.awt.Cursor#predefined
+java.awt.Dialog#hide()
+java.awt.Dialog#show()
+java.awt.Event
+java.awt.FontMetrics#getMaxDecent()
+java.awt.Frame#CROSSHAIR_CURSOR
+java.awt.Frame#DEFAULT_CURSOR
+java.awt.Frame#E_RESIZE_CURSOR
+java.awt.Frame#HAND_CURSOR
+java.awt.Frame#MOVE_CURSOR
+java.awt.Frame#NE_RESIZE_CURSOR
+java.awt.Frame#NW_RESIZE_CURSOR
+java.awt.Frame#N_RESIZE_CURSOR
+java.awt.Frame#SE_RESIZE_CURSOR
+java.awt.Frame#SW_RESIZE_CURSOR
+java.awt.Frame#S_RESIZE_CURSOR
+java.awt.Frame#TEXT_CURSOR
+java.awt.Frame#WAIT_CURSOR
+java.awt.Frame#W_RESIZE_CURSOR
+java.awt.Frame#getCursorType()
+java.awt.Frame#setCursor(int)
+java.awt.Graphics#finalize()
+java.awt.Graphics#getClipRect()
+java.awt.List#addItem(java.lang.String)
+java.awt.List#addItem(java.lang.String,int)
+java.awt.List#allowsMultipleSelections()
+java.awt.List#clear()
+java.awt.List#countItems()
+java.awt.List#delItem(int)
+java.awt.List#delItems(int,int)
+java.awt.List#isSelected(int)
+java.awt.List#minimumSize()
+java.awt.List#minimumSize(int)
+java.awt.List#preferredSize()
+java.awt.List#preferredSize(int)
+java.awt.List#setMultipleSelections(boolean)
+java.awt.Menu#countItems()
+java.awt.MenuBar#countMenus()
+java.awt.MenuComponent#postEvent(java.awt.Event)
+java.awt.MenuContainer#postEvent(java.awt.Event)
+java.awt.MenuItem#disable()
+java.awt.MenuItem#enable()
+java.awt.MenuItem#enable(boolean)
+java.awt.Polygon#getBoundingBox()
+java.awt.Polygon#inside(int,int)
+java.awt.PrintJob#finalize()
+java.awt.Rectangle#inside(int,int)
+java.awt.Rectangle#move(int,int)
+java.awt.Rectangle#reshape(int,int,int,int)
+java.awt.Rectangle#resize(int,int)
+java.awt.ScrollPane#layout()
+java.awt.Scrollbar#getLineIncrement()
+java.awt.Scrollbar#getPageIncrement()
+java.awt.Scrollbar#getVisible()
+java.awt.Scrollbar#setLineIncrement(int)
+java.awt.Scrollbar#setPageIncrement(int)
+java.awt.TextArea#appendText(java.lang.String)
+java.awt.TextArea#insertText(java.lang.String,int)
+java.awt.TextArea#minimumSize()
+java.awt.TextArea#minimumSize(int,int)
+java.awt.TextArea#preferredSize()
+java.awt.TextArea#preferredSize(int,int)
+java.awt.TextArea#replaceText(java.lang.String,int,int)
+java.awt.TextField#minimumSize()
+java.awt.TextField#minimumSize(int)
+java.awt.TextField#preferredSize()
+java.awt.TextField#preferredSize(int)
+java.awt.TextField#setEchoCharacter(char)
+java.awt.Toolkit#getFontList()
+java.awt.Toolkit#getFontMetrics(java.awt.Font)
+java.awt.Toolkit#getMenuShortcutKeyMask()
+java.awt.Window#applyResourceBundle(java.lang.String)
+java.awt.Window#applyResourceBundle(java.util.ResourceBundle)
+java.awt.Window#hide()
+java.awt.Window#postEvent(java.awt.Event)
+java.awt.Window#reshape(int,int,int,int)
+java.awt.Window#show()
+java.awt.datatransfer.DataFlavor#equals(java.lang.String)
+java.awt.datatransfer.DataFlavor#normalizeMimeType(java.lang.String)
+java.awt.datatransfer.DataFlavor#normalizeMimeTypeParameter(java.lang.String,java.lang.String)
+java.awt.datatransfer.DataFlavor#plainTextFlavor
+java.awt.event.InputEvent#ALT_GRAPH_MASK
+java.awt.event.InputEvent#ALT_MASK
+java.awt.event.InputEvent#BUTTON1_MASK
+java.awt.event.InputEvent#BUTTON2_MASK
+java.awt.event.InputEvent#BUTTON3_MASK
+java.awt.event.InputEvent#CTRL_MASK
+java.awt.event.InputEvent#META_MASK
+java.awt.event.InputEvent#SHIFT_MASK
+java.awt.event.InputEvent#getModifiers()
+java.awt.event.KeyEvent#(java.awt.Component,int,long,int,int)
+java.awt.event.KeyEvent#getKeyModifiersText(int)
+java.awt.event.KeyEvent#setModifiers(int)
+java.awt.image.renderable.RenderContext#concetenateTransform(java.awt.geom.AffineTransform)
+java.awt.image.renderable.RenderContext#preConcetenateTransform(java.awt.geom.AffineTransform)
+java.beans.AppletInitializer
+java.beans.Beans#instantiate(java.lang.ClassLoader,java.lang.String,java.beans.beancontext.BeanContext,java.beans.AppletInitializer)
+java.io.ByteArrayOutputStream#toString(int)
+java.io.DataInputStream#readLine()
+java.io.File#toURL()
+java.io.LineNumberInputStream
+java.io.ObjectInputStream#readLine()
+java.io.ObjectOutputStream$PutField#write(java.io.ObjectOutput)
+java.io.StreamTokenizer#(java.io.InputStream)
+java.io.StringBufferInputStream
+java.io.WriteAbortedException#detail
+java.lang.Boolean#(boolean)
+java.lang.Boolean#(java.lang.String)
+java.lang.Byte#(byte)
+java.lang.Byte#(java.lang.String)
+java.lang.Character#(char)
+java.lang.Character#isJavaLetter(char)
+java.lang.Character#isJavaLetterOrDigit(char)
+java.lang.Character#isSpace(char)
+java.lang.Character$UnicodeBlock#SURROGATES_AREA
+java.lang.Class#newInstance()
+java.lang.ClassLoader#defineClass(byte[],int,int)
+java.lang.ClassLoader#getPackage(java.lang.String)
+java.lang.Compiler
+java.lang.Double#(double)
+java.lang.Double#(java.lang.String)
+java.lang.Enum#finalize()
+java.lang.Float#(double)
+java.lang.Float#(float)
+java.lang.Float#(java.lang.String)
+java.lang.Integer#(int)
+java.lang.Integer#(java.lang.String)
+java.lang.Long#(java.lang.String)
+java.lang.Long#(long)
+java.lang.Object#finalize()
+java.lang.Package#getPackage(java.lang.String)
+java.lang.Runtime#exec(java.lang.String)
+java.lang.Runtime#exec(java.lang.String,java.lang.String[])
+java.lang.Runtime#exec(java.lang.String,java.lang.String[],java.io.File)
+java.lang.Runtime#runFinalization()
+java.lang.Runtime$Version#major()
+java.lang.Runtime$Version#minor()
+java.lang.Runtime$Version#security()
+java.lang.SecurityManager
+java.lang.Short#(java.lang.String)
+java.lang.Short#(short)
+java.lang.String#(byte[],int)
+java.lang.String#(byte[],int,int,int)
+java.lang.String#getBytes(int,int,byte[],int)
+java.lang.System#getSecurityManager()
+java.lang.System#runFinalization()
+java.lang.System#setSecurityManager(java.lang.SecurityManager)
+java.lang.Thread#checkAccess()
+java.lang.Thread#countStackFrames()
+java.lang.Thread#getId()
+java.lang.Thread#resume()
+java.lang.Thread#stop()
+java.lang.Thread#suspend()
+java.lang.ThreadDeath
+java.lang.ThreadGroup#allowThreadSuspension(boolean)
+java.lang.ThreadGroup#checkAccess()
+java.lang.ThreadGroup#destroy()
+java.lang.ThreadGroup#isDaemon()
+java.lang.ThreadGroup#isDestroyed()
+java.lang.ThreadGroup#resume()
+java.lang.ThreadGroup#setDaemon(boolean)
+java.lang.ThreadGroup#stop()
+java.lang.ThreadGroup#suspend()
+java.lang.invoke.MethodHandles$Lookup#hasPrivateAccess()
+java.lang.management.MemoryMXBean#getObjectPendingFinalizationCount()
+java.lang.ref.Reference#isEnqueued()
+java.lang.reflect.AccessibleObject#()
+java.lang.reflect.AccessibleObject#isAccessible()
+java.lang.reflect.Proxy#getProxyClass(java.lang.ClassLoader,java.lang.Class[])
+java.math.BigDecimal#ROUND_CEILING
+java.math.BigDecimal#ROUND_DOWN
+java.math.BigDecimal#ROUND_FLOOR
+java.math.BigDecimal#ROUND_HALF_DOWN
+java.math.BigDecimal#ROUND_HALF_EVEN
+java.math.BigDecimal#ROUND_HALF_UP
+java.math.BigDecimal#ROUND_UNNECESSARY
+java.math.BigDecimal#ROUND_UP
+java.math.BigDecimal#divide(java.math.BigDecimal,int)
+java.math.BigDecimal#divide(java.math.BigDecimal,int,int)
+java.math.BigDecimal#setScale(int,int)
+java.net.DatagramSocket#setDatagramSocketImplFactory(java.net.DatagramSocketImplFactory)
+java.net.DatagramSocketImpl#getTTL()
+java.net.DatagramSocketImpl#setTTL(byte)
+java.net.HttpURLConnection#HTTP_SERVER_ERROR
+java.net.MulticastSocket#getInterface()
+java.net.MulticastSocket#getLoopbackMode()
+java.net.MulticastSocket#getTTL()
+java.net.MulticastSocket#joinGroup(java.net.InetAddress)
+java.net.MulticastSocket#leaveGroup(java.net.InetAddress)
+java.net.MulticastSocket#send(java.net.DatagramPacket,byte)
+java.net.MulticastSocket#setInterface(java.net.InetAddress)
+java.net.MulticastSocket#setLoopbackMode(boolean)
+java.net.MulticastSocket#setTTL(byte)
+java.net.ServerSocket#setSocketFactory(java.net.SocketImplFactory)
+java.net.Socket#(java.lang.String,int,boolean)
+java.net.Socket#(java.net.InetAddress,int,boolean)
+java.net.Socket#setSocketImplFactory(java.net.SocketImplFactory)
+java.net.URL#(java.lang.String)
+java.net.URL#(java.lang.String,java.lang.String,int,java.lang.String)
+java.net.URL#(java.lang.String,java.lang.String,int,java.lang.String,java.net.URLStreamHandler)
+java.net.URL#(java.lang.String,java.lang.String,java.lang.String)
+java.net.URL#(java.net.URL,java.lang.String)
+java.net.URL#(java.net.URL,java.lang.String,java.net.URLStreamHandler)
+java.net.URLConnection#getDefaultRequestProperty(java.lang.String)
+java.net.URLConnection#setDefaultRequestProperty(java.lang.String,java.lang.String)
+java.net.URLDecoder#decode(java.lang.String)
+java.net.URLEncoder#encode(java.lang.String)
+java.net.URLStreamHandler#setURL(java.net.URL,java.lang.String,java.lang.String,int,java.lang.String,java.lang.String)
+java.rmi.RMISecurityException
+java.rmi.RMISecurityManager
+java.rmi.ServerRuntimeException
+java.rmi.dgc.VMID#isUnique()
+java.rmi.registry.RegistryHandler
+java.rmi.server.LoaderHandler
+java.rmi.server.LogStream
+java.rmi.server.Operation
+java.rmi.server.RMIClassLoader#getSecurityContext(java.lang.ClassLoader)
+java.rmi.server.RMIClassLoader#loadClass(java.lang.String)
+java.rmi.server.RemoteCall
+java.rmi.server.RemoteRef#done(java.rmi.server.RemoteCall)
+java.rmi.server.RemoteRef#invoke(java.rmi.server.RemoteCall)
+java.rmi.server.RemoteRef#newCall(java.rmi.server.RemoteObject,java.rmi.server.Operation[],int,long)
+java.rmi.server.RemoteRef#serialVersionUID
+java.rmi.server.RemoteStub
+java.rmi.server.ServerRef
+java.rmi.server.Skeleton
+java.rmi.server.SkeletonMismatchException
+java.rmi.server.SkeletonNotFoundException
+java.rmi.server.SocketSecurityException
+java.rmi.server.UnicastRemoteObject#exportObject(java.rmi.Remote)
+java.security.AccessControlContext
+java.security.AccessControlException
+java.security.AccessController
+java.security.AuthProvider#(java.lang.String,double,java.lang.String)
+java.security.Certificate
+java.security.DomainCombiner
+java.security.Identity
+java.security.IdentityScope
+java.security.Key#serialVersionUID
+java.security.Policy
+java.security.Policy$Parameters
+java.security.PolicySpi
+java.security.PrivateKey#serialVersionUID
+java.security.Provider#(java.lang.String,double,java.lang.String)
+java.security.Provider#getVersion()
+java.security.PublicKey#serialVersionUID
+java.security.Security#getAlgorithmProperty(java.lang.String,java.lang.String)
+java.security.Signature#getParameter(java.lang.String)
+java.security.Signature#setParameter(java.lang.String,java.lang.Object)
+java.security.SignatureSpi#engineGetParameter(java.lang.String)
+java.security.SignatureSpi#engineSetParameter(java.lang.String,java.lang.Object)
+java.security.Signer
+java.security.cert.X509CRL#getIssuerDN()
+java.security.cert.X509CRLSelector#addIssuerName(java.lang.String)
+java.security.cert.X509CertSelector#getIssuerAsString()
+java.security.cert.X509CertSelector#getSubjectAsString()
+java.security.cert.X509CertSelector#setIssuer(java.lang.String)
+java.security.cert.X509CertSelector#setSubject(java.lang.String)
+java.security.cert.X509Certificate#getIssuerDN()
+java.security.cert.X509Certificate#getSubjectDN()
+java.security.interfaces.DSAPrivateKey#serialVersionUID
+java.security.interfaces.DSAPublicKey#serialVersionUID
+java.security.interfaces.ECPrivateKey#serialVersionUID
+java.security.interfaces.ECPublicKey#serialVersionUID
+java.security.interfaces.RSAMultiPrimePrivateCrtKey#serialVersionUID
+java.security.interfaces.RSAPrivateCrtKey#serialVersionUID
+java.security.interfaces.RSAPrivateKey#serialVersionUID
+java.security.interfaces.RSAPublicKey#serialVersionUID
+java.security.spec.PSSParameterSpec#(int)
+java.security.spec.PSSParameterSpec#DEFAULT
+java.sql.CallableStatement#getBigDecimal(int,int)
+java.sql.Date#(int,int,int)
+java.sql.Date#getHours()
+java.sql.Date#getMinutes()
+java.sql.Date#getSeconds()
+java.sql.Date#setHours(int)
+java.sql.Date#setMinutes(int)
+java.sql.Date#setSeconds(int)
+java.sql.DriverManager#getLogStream()
+java.sql.DriverManager#setLogStream(java.io.PrintStream)
+java.sql.PreparedStatement#setUnicodeStream(int,java.io.InputStream,int)
+java.sql.ResultSet#getBigDecimal(int,int)
+java.sql.ResultSet#getBigDecimal(java.lang.String,int)
+java.sql.ResultSet#getUnicodeStream(int)
+java.sql.ResultSet#getUnicodeStream(java.lang.String)
+java.sql.Time#(int,int,int)
+java.sql.Time#getDate()
+java.sql.Time#getDay()
+java.sql.Time#getMonth()
+java.sql.Time#getYear()
+java.sql.Time#setDate(int)
+java.sql.Time#setMonth(int)
+java.sql.Time#setYear(int)
+java.sql.Timestamp#(int,int,int,int,int,int,int)
+java.util.Date#(int,int,int)
+java.util.Date#(int,int,int,int,int)
+java.util.Date#(int,int,int,int,int,int)
+java.util.Date#(java.lang.String)
+java.util.Date#UTC(int,int,int,int,int,int)
+java.util.Date#getDate()
+java.util.Date#getDay()
+java.util.Date#getHours()
+java.util.Date#getMinutes()
+java.util.Date#getMonth()
+java.util.Date#getSeconds()
+java.util.Date#getTimezoneOffset()
+java.util.Date#getYear()
+java.util.Date#parse(java.lang.String)
+java.util.Date#setDate(int)
+java.util.Date#setHours(int)
+java.util.Date#setMinutes(int)
+java.util.Date#setMonth(int)
+java.util.Date#setSeconds(int)
+java.util.Date#setYear(int)
+java.util.Date#toGMTString()
+java.util.Date#toLocaleString()
+java.util.Locale#(java.lang.String)
+java.util.Locale#(java.lang.String,java.lang.String)
+java.util.Locale#(java.lang.String,java.lang.String,java.lang.String)
+java.util.Observable
+java.util.Observer
+java.util.Properties#save(java.io.OutputStream,java.lang.String)
+java.util.concurrent.Executors#privilegedCallable(java.util.concurrent.Callable)
+java.util.concurrent.Executors#privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable)
+java.util.concurrent.Executors#privilegedThreadFactory()
+java.util.concurrent.ThreadPoolExecutor#finalize()
+java.util.concurrent.atomic.AtomicBoolean#weakCompareAndSet(boolean,boolean)
+java.util.concurrent.atomic.AtomicInteger#weakCompareAndSet(int,int)
+java.util.concurrent.atomic.AtomicIntegerArray#weakCompareAndSet(int,int,int)
+java.util.concurrent.atomic.AtomicLong#weakCompareAndSet(long,long)
+java.util.concurrent.atomic.AtomicLongArray#weakCompareAndSet(int,long,long)
+java.util.concurrent.atomic.AtomicReference#weakCompareAndSet(java.lang.Object,java.lang.Object)
+java.util.concurrent.atomic.AtomicReferenceArray#weakCompareAndSet(int,java.lang.Object,java.lang.Object)
+java.util.jar.Attributes$Name#EXTENSION_INSTALLATION
+java.util.jar.Attributes$Name#IMPLEMENTATION_URL
+java.util.jar.Attributes$Name#IMPLEMENTATION_VENDOR_ID
+java.util.logging.LogManager#checkAccess()
+java.util.logging.LogManager#getLoggingMXBean()
+java.util.logging.LogRecord#getThreadID()
+java.util.logging.LogRecord#setMillis(long)
+java.util.logging.LogRecord#setThreadID(int)
+java.util.logging.Logger#global
+java.util.logging.Logger#logrb(java.util.logging.Level,java.lang.String,java.lang.String,java.lang.String,java.lang.String)
+java.util.logging.Logger#logrb(java.util.logging.Level,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.Object)
+java.util.logging.Logger#logrb(java.util.logging.Level,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.Object[])
+java.util.logging.Logger#logrb(java.util.logging.Level,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.Throwable)
+java.util.logging.LoggingMXBean
+javax.accessibility.AccessibleResourceBundle
+javax.crypto.SecretKey#serialVersionUID
+javax.crypto.interfaces.DHPrivateKey#serialVersionUID
+javax.crypto.interfaces.DHPublicKey#serialVersionUID
+javax.crypto.interfaces.PBEKey#serialVersionUID
+javax.crypto.spec.OAEPParameterSpec#DEFAULT
+javax.imageio.spi.ImageReaderSpi#STANDARD_INPUT_TYPE
+javax.imageio.spi.ImageWriterSpi#STANDARD_OUTPUT_TYPE
+javax.imageio.spi.ServiceRegistry#finalize()
+javax.imageio.stream.FileCacheImageInputStream#finalize()
+javax.imageio.stream.FileImageInputStream#finalize()
+javax.imageio.stream.FileImageOutputStream#finalize()
+javax.imageio.stream.ImageInputStreamImpl#finalize()
+javax.imageio.stream.MemoryCacheImageInputStream#finalize()
+javax.lang.model.util.AbstractAnnotationValueVisitor6#()
+javax.lang.model.util.AbstractAnnotationValueVisitor7#()
+javax.lang.model.util.AbstractElementVisitor6#()
+javax.lang.model.util.AbstractElementVisitor7#()
+javax.lang.model.util.AbstractTypeVisitor6#()
+javax.lang.model.util.AbstractTypeVisitor7#()
+javax.lang.model.util.ElementKindVisitor6#()
+javax.lang.model.util.ElementKindVisitor6#(java.lang.Object)
+javax.lang.model.util.ElementKindVisitor7#()
+javax.lang.model.util.ElementKindVisitor7#(java.lang.Object)
+javax.lang.model.util.ElementScanner6#()
+javax.lang.model.util.ElementScanner6#(java.lang.Object)
+javax.lang.model.util.ElementScanner7#()
+javax.lang.model.util.ElementScanner7#(java.lang.Object)
+javax.lang.model.util.SimpleAnnotationValueVisitor6#()
+javax.lang.model.util.SimpleAnnotationValueVisitor6#(java.lang.Object)
+javax.lang.model.util.SimpleAnnotationValueVisitor7#()
+javax.lang.model.util.SimpleAnnotationValueVisitor7#(java.lang.Object)
+javax.lang.model.util.SimpleElementVisitor6#()
+javax.lang.model.util.SimpleElementVisitor6#(java.lang.Object)
+javax.lang.model.util.SimpleElementVisitor7#()
+javax.lang.model.util.SimpleElementVisitor7#(java.lang.Object)
+javax.lang.model.util.SimpleTypeVisitor6#()
+javax.lang.model.util.SimpleTypeVisitor6#(java.lang.Object)
+javax.lang.model.util.SimpleTypeVisitor7#()
+javax.lang.model.util.SimpleTypeVisitor7#(java.lang.Object)
+javax.lang.model.util.TypeKindVisitor6#()
+javax.lang.model.util.TypeKindVisitor6#(java.lang.Object)
+javax.lang.model.util.TypeKindVisitor7#()
+javax.lang.model.util.TypeKindVisitor7#(java.lang.Object)
+javax.management.AttributeValueExp#()
+javax.management.AttributeValueExp#setMBeanServer(javax.management.MBeanServer)
+javax.management.DefaultLoaderRepository
+javax.management.MBeanServer#deserialize(java.lang.String,byte[])
+javax.management.MBeanServer#deserialize(java.lang.String,javax.management.ObjectName,byte[])
+javax.management.MBeanServer#deserialize(javax.management.ObjectName,byte[])
+javax.management.StringValueExp#setMBeanServer(javax.management.MBeanServer)
+javax.management.ValueExp#setMBeanServer(javax.management.MBeanServer)
+javax.management.loading.DefaultLoaderRepository
+javax.management.loading.MLet
+javax.management.loading.MLetContent
+javax.management.loading.MLetMBean
+javax.management.loading.PrivateMLet
+javax.management.monitor.CounterMonitor#getDerivedGauge()
+javax.management.monitor.CounterMonitor#getDerivedGaugeTimeStamp()
+javax.management.monitor.CounterMonitor#getThreshold()
+javax.management.monitor.CounterMonitor#setThreshold(java.lang.Number)
+javax.management.monitor.CounterMonitorMBean#getDerivedGauge()
+javax.management.monitor.CounterMonitorMBean#getDerivedGaugeTimeStamp()
+javax.management.monitor.CounterMonitorMBean#getThreshold()
+javax.management.monitor.CounterMonitorMBean#setThreshold(java.lang.Number)
+javax.management.monitor.GaugeMonitor#getDerivedGauge()
+javax.management.monitor.GaugeMonitor#getDerivedGaugeTimeStamp()
+javax.management.monitor.GaugeMonitorMBean#getDerivedGauge()
+javax.management.monitor.GaugeMonitorMBean#getDerivedGaugeTimeStamp()
+javax.management.monitor.Monitor#alreadyNotified
+javax.management.monitor.Monitor#dbgTag
+javax.management.monitor.Monitor#getObservedObject()
+javax.management.monitor.Monitor#setObservedObject(javax.management.ObjectName)
+javax.management.monitor.MonitorMBean#getObservedObject()
+javax.management.monitor.MonitorMBean#setObservedObject(javax.management.ObjectName)
+javax.management.monitor.StringMonitor#getDerivedGauge()
+javax.management.monitor.StringMonitor#getDerivedGaugeTimeStamp()
+javax.management.monitor.StringMonitorMBean#getDerivedGauge()
+javax.management.monitor.StringMonitorMBean#getDerivedGaugeTimeStamp()
+javax.management.openmbean.OpenType#ALLOWED_CLASSNAMES
+javax.management.relation.RoleStatus#()
+javax.management.remote.rmi.RMIIIOPServerImpl
+javax.naming.Context#APPLET
+javax.naming.Name#serialVersionUID
+javax.naming.directory.Attribute#serialVersionUID
+javax.net.ssl.HandshakeCompletedEvent#getPeerCertificateChain()
+javax.net.ssl.SSLSession#getPeerCertificateChain()
+javax.security.auth.Subject#doAs(javax.security.auth.Subject,java.security.PrivilegedAction)
+javax.security.auth.Subject#doAs(javax.security.auth.Subject,java.security.PrivilegedExceptionAction)
+javax.security.auth.Subject#doAsPrivileged(javax.security.auth.Subject,java.security.PrivilegedAction,java.security.AccessControlContext)
+javax.security.auth.Subject#doAsPrivileged(javax.security.auth.Subject,java.security.PrivilegedExceptionAction,java.security.AccessControlContext)
+javax.security.auth.Subject#getSubject(java.security.AccessControlContext)
+javax.security.auth.SubjectDomainCombiner
+javax.security.cert.Certificate
+javax.security.cert.CertificateEncodingException
+javax.security.cert.CertificateException
+javax.security.cert.CertificateExpiredException
+javax.security.cert.CertificateNotYetValidException
+javax.security.cert.CertificateParsingException
+javax.security.cert.X509Certificate
+javax.sql.rowset.BaseRowSet#setUnicodeStream(int,java.io.InputStream,int)
+javax.sql.rowset.CachedRowSet#COMMIT_ON_ACCEPT_CHANGES
+javax.swing.AbstractButton#getLabel()
+javax.swing.AbstractButton#setLabel(java.lang.String)
+javax.swing.FocusManager#disableSwingFocusManager()
+javax.swing.FocusManager#isFocusManagerEnabled()
+javax.swing.ImageIcon#component
+javax.swing.ImageIcon#tracker
+javax.swing.InputVerifier#shouldYieldFocus(javax.swing.JComponent)
+javax.swing.JApplet
+javax.swing.JComponent#disable()
+javax.swing.JComponent#enable()
+javax.swing.JComponent#getNextFocusableComponent()
+javax.swing.JComponent#hide()
+javax.swing.JComponent#isManagingFocus()
+javax.swing.JComponent#requestDefaultFocus()
+javax.swing.JComponent#reshape(int,int,int,int)
+javax.swing.JComponent#setNextFocusableComponent(java.awt.Component)
+javax.swing.JComponent$AccessibleJComponent#accessibleFocusHandler
+javax.swing.JComponent$AccessibleJComponent$AccessibleFocusHandler
+javax.swing.JInternalFrame#getMenuBar()
+javax.swing.JInternalFrame#setMenuBar(javax.swing.JMenuBar)
+javax.swing.JList#getSelectedValues()
+javax.swing.JMenuBar#getComponentAtIndex(int)
+javax.swing.JPasswordField#getText()
+javax.swing.JPasswordField#getText(int,int)
+javax.swing.JPopupMenu#getComponentAtIndex(int)
+javax.swing.JRootPane#getMenuBar()
+javax.swing.JRootPane#setMenuBar(javax.swing.JMenuBar)
+javax.swing.JTable#createScrollPaneForTable(javax.swing.JTable)
+javax.swing.JTable#sizeColumnsToFit(boolean)
+javax.swing.JViewport#backingStore
+javax.swing.JViewport#isBackingStoreEnabled()
+javax.swing.JViewport#setBackingStoreEnabled(boolean)
+javax.swing.KeyStroke#getKeyStroke(char,boolean)
+javax.swing.RepaintManager#addDirtyRegion(java.applet.Applet,int,int,int,int)
+javax.swing.ScrollPaneLayout#getViewportBorderBounds(javax.swing.JScrollPane)
+javax.swing.SwingUtilities#findFocusOwner(java.awt.Component)
+javax.swing.plaf.TextUI#getToolTipText(javax.swing.text.JTextComponent,java.awt.Point)
+javax.swing.plaf.TextUI#modelToView(javax.swing.text.JTextComponent,int)
+javax.swing.plaf.TextUI#modelToView(javax.swing.text.JTextComponent,int,javax.swing.text.Position$Bias)
+javax.swing.plaf.TextUI#viewToModel(javax.swing.text.JTextComponent,java.awt.Point)
+javax.swing.plaf.TextUI#viewToModel(javax.swing.text.JTextComponent,java.awt.Point,javax.swing.text.Position$Bias[])
+javax.swing.plaf.basic.BasicDesktopPaneUI#closeKey
+javax.swing.plaf.basic.BasicDesktopPaneUI#maximizeKey
+javax.swing.plaf.basic.BasicDesktopPaneUI#minimizeKey
+javax.swing.plaf.basic.BasicDesktopPaneUI#navigateKey
+javax.swing.plaf.basic.BasicDesktopPaneUI#navigateKey2
+javax.swing.plaf.basic.BasicDirectoryModel#intervalAdded(javax.swing.event.ListDataEvent)
+javax.swing.plaf.basic.BasicDirectoryModel#intervalRemoved(javax.swing.event.ListDataEvent)
+javax.swing.plaf.basic.BasicDirectoryModel#lt(java.io.File,java.io.File)
+javax.swing.plaf.basic.BasicInternalFrameUI#openMenuKey
+javax.swing.plaf.basic.BasicMenuItemUI$MouseInputHandler
+javax.swing.plaf.basic.BasicScrollPaneUI$HSBChangeListener
+javax.swing.plaf.basic.BasicScrollPaneUI$PropertyChangeHandler
+javax.swing.plaf.basic.BasicScrollPaneUI$VSBChangeListener
+javax.swing.plaf.basic.BasicScrollPaneUI$ViewportChangeHandler
+javax.swing.plaf.basic.BasicSplitPaneUI#createKeyboardDownRightListener()
+javax.swing.plaf.basic.BasicSplitPaneUI#createKeyboardEndListener()
+javax.swing.plaf.basic.BasicSplitPaneUI#createKeyboardHomeListener()
+javax.swing.plaf.basic.BasicSplitPaneUI#createKeyboardResizeToggleListener()
+javax.swing.plaf.basic.BasicSplitPaneUI#createKeyboardUpLeftListener()
+javax.swing.plaf.basic.BasicSplitPaneUI#dividerResizeToggleKey
+javax.swing.plaf.basic.BasicSplitPaneUI#downKey
+javax.swing.plaf.basic.BasicSplitPaneUI#endKey
+javax.swing.plaf.basic.BasicSplitPaneUI#getDividerBorderSize()
+javax.swing.plaf.basic.BasicSplitPaneUI#homeKey
+javax.swing.plaf.basic.BasicSplitPaneUI#keyboardDownRightListener
+javax.swing.plaf.basic.BasicSplitPaneUI#keyboardEndListener
+javax.swing.plaf.basic.BasicSplitPaneUI#keyboardHomeListener
+javax.swing.plaf.basic.BasicSplitPaneUI#keyboardResizeToggleListener
+javax.swing.plaf.basic.BasicSplitPaneUI#keyboardUpLeftListener
+javax.swing.plaf.basic.BasicSplitPaneUI#leftKey
+javax.swing.plaf.basic.BasicSplitPaneUI#rightKey
+javax.swing.plaf.basic.BasicSplitPaneUI#upKey
+javax.swing.plaf.basic.BasicTabbedPaneUI#downKey
+javax.swing.plaf.basic.BasicTabbedPaneUI#leftKey
+javax.swing.plaf.basic.BasicTabbedPaneUI#rightKey
+javax.swing.plaf.basic.BasicTabbedPaneUI#upKey
+javax.swing.plaf.basic.BasicTextUI#modelToView(javax.swing.text.JTextComponent,int)
+javax.swing.plaf.basic.BasicTextUI#modelToView(javax.swing.text.JTextComponent,int,javax.swing.text.Position$Bias)
+javax.swing.plaf.basic.BasicTextUI#viewToModel(javax.swing.text.JTextComponent,java.awt.Point)
+javax.swing.plaf.basic.BasicTextUI#viewToModel(javax.swing.text.JTextComponent,java.awt.Point,javax.swing.text.Position$Bias[])
+javax.swing.plaf.basic.BasicToolBarUI#createFloatingFrame(javax.swing.JToolBar)
+javax.swing.plaf.basic.BasicToolBarUI#downKey
+javax.swing.plaf.basic.BasicToolBarUI#leftKey
+javax.swing.plaf.basic.BasicToolBarUI#rightKey
+javax.swing.plaf.basic.BasicToolBarUI#upKey
+javax.swing.plaf.metal.MetalComboBoxUI#editablePropertyChanged(java.beans.PropertyChangeEvent)
+javax.swing.plaf.metal.MetalComboBoxUI#removeListeners()
+javax.swing.plaf.metal.MetalComboBoxUI$MetalComboPopup
+javax.swing.plaf.metal.MetalFileChooserUI$FileRenderer
+javax.swing.plaf.metal.MetalFileChooserUI$SingleClickListener
+javax.swing.plaf.metal.MetalScrollPaneUI#uninstallListeners(javax.swing.JScrollPane)
+javax.swing.plaf.multi.MultiTextUI#modelToView(javax.swing.text.JTextComponent,int)
+javax.swing.plaf.multi.MultiTextUI#modelToView(javax.swing.text.JTextComponent,int,javax.swing.text.Position$Bias)
+javax.swing.plaf.multi.MultiTextUI#viewToModel(javax.swing.text.JTextComponent,java.awt.Point)
+javax.swing.plaf.multi.MultiTextUI#viewToModel(javax.swing.text.JTextComponent,java.awt.Point,javax.swing.text.Position$Bias[])
+javax.swing.table.TableColumn#disableResizedPosting()
+javax.swing.table.TableColumn#enableResizedPosting()
+javax.swing.table.TableColumn#resizedPostingDisableCount
+javax.swing.text.DefaultTextUI
+javax.swing.text.JTextComponent#modelToView(int)
+javax.swing.text.JTextComponent#viewToModel(java.awt.Point)
+javax.swing.text.LabelView#getFontMetrics()
+javax.swing.text.PasswordView#drawEchoCharacter(java.awt.Graphics,int,int,char)
+javax.swing.text.PasswordView#drawSelectedText(java.awt.Graphics,int,int,int,int)
+javax.swing.text.PasswordView#drawUnselectedText(java.awt.Graphics,int,int,int,int)
+javax.swing.text.PlainView#drawLine(int,java.awt.Graphics,int,int)
+javax.swing.text.PlainView#drawSelectedText(java.awt.Graphics,int,int,int,int)
+javax.swing.text.PlainView#drawUnselectedText(java.awt.Graphics,int,int,int,int)
+javax.swing.text.TableView#createTableCell(javax.swing.text.Element)
+javax.swing.text.TableView$TableCell
+javax.swing.text.Utilities#drawTabbedText(javax.swing.text.Segment,int,int,java.awt.Graphics,javax.swing.text.TabExpander,int)
+javax.swing.text.Utilities#getBreakLocation(javax.swing.text.Segment,java.awt.FontMetrics,int,int,javax.swing.text.TabExpander,int)
+javax.swing.text.Utilities#getPositionAbove(javax.swing.text.JTextComponent,int,int)
+javax.swing.text.Utilities#getPositionBelow(javax.swing.text.JTextComponent,int,int)
+javax.swing.text.Utilities#getTabbedTextOffset(javax.swing.text.Segment,java.awt.FontMetrics,int,int,javax.swing.text.TabExpander,int)
+javax.swing.text.Utilities#getTabbedTextOffset(javax.swing.text.Segment,java.awt.FontMetrics,int,int,javax.swing.text.TabExpander,int,boolean)
+javax.swing.text.Utilities#getTabbedTextWidth(javax.swing.text.Segment,java.awt.FontMetrics,int,javax.swing.text.TabExpander,int)
+javax.swing.text.View#modelToView(int,java.awt.Shape)
+javax.swing.text.View#viewToModel(float,float,java.awt.Shape)
+javax.swing.text.WrappedPlainView#drawLine(int,int,java.awt.Graphics,int,int)
+javax.swing.text.WrappedPlainView#drawSelectedText(java.awt.Graphics,int,int,int,int)
+javax.swing.text.WrappedPlainView#drawUnselectedText(java.awt.Graphics,int,int,int,int)
+javax.swing.text.html.FormView#RESET
+javax.swing.text.html.FormView#SUBMIT
+javax.swing.text.html.HTMLEditorKit$InsertHTMLTextAction#insertAtBoundry(javax.swing.JEditorPane,javax.swing.text.html.HTMLDocument,int,javax.swing.text.Element,java.lang.String,javax.swing.text.html.HTML$Tag,javax.swing.text.html.HTML$Tag)
+javax.swing.tree.DefaultTreeSelectionModel#notifyPathChange(java.util.Vector,javax.swing.tree.TreePath)
+javax.tools.StandardJavaFileManager#getJavaFileObjectsFromPaths(java.lang.Iterable)
+javax.tools.ToolProvider#getSystemToolClassLoader()
+javax.xml.stream.XMLEventFactory#newInstance(java.lang.String,java.lang.ClassLoader)
+javax.xml.stream.XMLInputFactory#newInstance(java.lang.String,java.lang.ClassLoader)
+javax.xml.stream.XMLOutputFactory#newInstance(java.lang.String,java.lang.ClassLoader)
+org.ietf.jgss.GSSContext#acceptSecContext(java.io.InputStream,java.io.OutputStream)
+org.ietf.jgss.GSSContext#getMIC(java.io.InputStream,java.io.OutputStream,org.ietf.jgss.MessageProp)
+org.ietf.jgss.GSSContext#initSecContext(java.io.InputStream,java.io.OutputStream)
+org.ietf.jgss.GSSContext#unwrap(java.io.InputStream,java.io.OutputStream,org.ietf.jgss.MessageProp)
+org.ietf.jgss.GSSContext#verifyMIC(java.io.InputStream,java.io.InputStream,org.ietf.jgss.MessageProp)
+org.ietf.jgss.GSSContext#wrap(java.io.InputStream,java.io.OutputStream,org.ietf.jgss.MessageProp)
+org.xml.sax.AttributeList
+org.xml.sax.DocumentHandler
+org.xml.sax.HandlerBase
+org.xml.sax.Parser
+org.xml.sax.helpers.AttributeListImpl
+org.xml.sax.helpers.ParserFactory
+org.xml.sax.helpers.XMLReaderFactory
diff --git a/src/main/resources/de/thetaphi/forbiddenapis/signatures/jdk-internal-20.txt b/src/main/resources/de/thetaphi/forbiddenapis/signatures/jdk-internal-20.txt
new file mode 100644
index 0000000..cd970fc
--- /dev/null
+++ b/src/main/resources/de/thetaphi/forbiddenapis/signatures/jdk-internal-20.txt
@@ -0,0 +1,10 @@
+# This file contains API signatures that are marked as internal in Java.
+# It is provided here for reference, but can easily regenerated by executing from the source folder of forbidden-apis:
+# $ ant generate-internal
+
+# This file contains all internal packages listed in Security.getProperty("package.access") of Java version 20 (extracted from build 20).
+
+@defaultMessage non-public internal runtime class in Java 20
+
+sun.misc.**
+sun.reflect.**
diff --git a/src/main/resources/de/thetaphi/forbiddenapis/signatures/jdk-unsafe-20.txt b/src/main/resources/de/thetaphi/forbiddenapis/signatures/jdk-unsafe-20.txt
new file mode 100644
index 0000000..dc23005
--- /dev/null
+++ b/src/main/resources/de/thetaphi/forbiddenapis/signatures/jdk-unsafe-20.txt
@@ -0,0 +1,19 @@
+# (C) Copyright Uwe Schindler (Generics Policeman) and others.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# These methods and classes should not be used by server classes (unsafe, no charset, no locale,...):
+
+# We only include 19 for now.
+# TODO: Scan Java 20 API for additional locale/charset/... violations!
+@includeBundled jdk-unsafe-19