Skip to content

Instantly share code, notes, and snippets.

@jbosboom
Created May 10, 2015 02:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jbosboom/72bf5fead1bf393403f3 to your computer and use it in GitHub Desktop.
Save jbosboom/72bf5fead1bf393403f3 to your computer and use it in GitHub Desktop.
Removes unused private constructors from .class files
/*
* Copyright (c) 2015 Jeffrey Bosboom
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.jeffreybosboom.deletedconstructors;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ConstantHistogrammer;
import org.objectweb.asm.ConstantPoolSortingClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
/**
* Removes unused private constructors. Inner class constructors are
* conservatively retained because they're accessible to enclosing classes, but
* no attempt is made to retain constructors used by reflective or native code.
* <p/>
* See <a href="http://jeffreybosboom.com/blog/articles/how-many-bytes-could-you-save-if-java-had-constructorless-classes/">
* this blog post</a> for more information.
* <p/>
* This class uses ConstantPoolSortingClassWriter, which is not a standard ASM
* component (despite being in the org.objectweb.asm package). The code is
* <a href="https://gist.github.com/jbosboom/86b7c24825b0d40121fa">available as
* a GitHub Gist</a> and <a href="http://stackoverflow.com/q/29079192/3614835">
* documented by a Stack Overflow question and answer</a>.
* @author Jeffrey Bosboom
*/
public final class RemoveUnusedPrivateCtors {
public static List<Map.Entry<String, Integer>> savings = new ArrayList<>();
public static void main(String[] args) throws IOException {
Path src = Paths.get("C:\\Users\\jbosboom\\Desktop\\rt");
Path dest = Paths.get("C:\\Users\\jbosboom\\Desktop\\rt-delctor");
Files.walkFileTree(src, new DelCtor(src, dest));
savings.sort(Comparator.comparing(Map.Entry<String, Integer>::getValue).reversed());
savings.forEach(e -> System.out.format("%5d %s%n", e.getValue(), e.getKey()));
System.out.println(savings.stream().mapToInt(Map.Entry::getValue).sum());
}
private static Optional<Map.Entry<String, Integer>> minimize(Path input, Path output) throws IOException {
byte[] inputBytes = Files.readAllBytes(input);
ClassReader cr = new ClassReader(inputBytes);
ConstantPoolSortingClassWriter cw = new ConstantPoolSortingClassWriter(0);
ConstantHistogrammer ch = new ConstantHistogrammer(cw);
ClassVisitor rpca = new RemovePrivateCtorAdapter(ch);
try {
cr.accept(rpca, 0);
} catch (Bailout ignored) {
return Optional.empty();
}
byte[] outputBytes = cw.toByteArray();
int bytesSaved = inputBytes.length - outputBytes.length;
if (output != null)
Files.write(output, outputBytes);
return Optional.of(new AbstractMap.SimpleImmutableEntry<>(cr.getClassName(), bytesSaved));
}
private static final class DelCtor implements FileVisitor<Path> {
private final Path src;
private final Path dest;
private DelCtor(Path src, Path dest) throws IOException {
this.src = src;
this.dest = dest;
Files.createDirectories(dest);
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
Path target = dest.resolve(src.relativize(dir));
Files.createDirectories(target);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Path target = dest.resolve(src.relativize(file));
if (!file.toString().endsWith(".class")) {
//copy resources
Files.copy(file, target);
return FileVisitResult.CONTINUE;
}
Optional<Map.Entry<String, Integer>> result = minimize(file, target);
result.ifPresent(savings::add);
if (!result.isPresent()) Files.copy(file, target);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
exc.printStackTrace();
throw exc;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
}
private static final class RemovePrivateCtorAdapter extends ClassVisitor {
private String myName;
private final List<String> removed = new ArrayList<>();
private RemovePrivateCtorAdapter(ClassVisitor cv) {
super(Opcodes.ASM5, cv);
}
@Override
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
myName = name;
int idx = myName.lastIndexOf('$');
if (idx != -1)
myName = myName.substring(idx+1);
super.visit(version, access, name, signature, superName, interfaces);
}
@Override
public void visitInnerClass(String name, String outerName, String innerName, int access) {
//bail out if we're an inner class, because our enclosing class can
//use our private constructors
if (myName.equals(innerName)) throw BAILOUT;
super.visitInnerClass(name, outerName, innerName, access);
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
//remove private constructors
if (name.equals("<init>") && ((access & Opcodes.ACC_PRIVATE) != 0)) {
removed.add(myName+" "+name+" "+desc+" "+signature+" "+(access & Opcodes.ACC_PRIVATE));
return null;
}
return new BailOutIfCtorCalled(
super.visitMethod(access, name, desc, signature, exceptions),
myName);
}
@Override
public void visitEnd() {
if (removed.isEmpty()) throw new Bailout();
// removed.forEach(System.out::println);
super.visitEnd();
}
}
private static final class BailOutIfCtorCalled extends MethodVisitor {
private final String myName;
private BailOutIfCtorCalled(MethodVisitor mv, String myName) {
super(Opcodes.ASM5, mv);
this.myName = myName;
}
@Override
public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
//if a private constructor is referenced from inside its class (e.g.
//a static factory method) we can't remove it
if (owner.equals(myName) && name.equals("<init>")) throw BAILOUT;
super.visitMethodInsn(opcode, owner, name, desc, itf);
}
}
private static final Bailout BAILOUT = new Bailout();
private static final class Bailout extends RuntimeException {
@Override
public synchronized Throwable fillInStackTrace() {
return this;
}
}
}
1033 sun/security/krb5/KrbPriv
472 com/sun/org/apache/xpath/internal/axes/NodeSequence
390 java/io/FileNotFoundException
352 com/sun/xml/internal/ws/api/pipe/helper/PipeAdapter$1TubeAdapter
229 javax/net/ssl/StandardConstants
200 java/nio/charset/StandardCharsets
198 com/sun/xml/internal/ws/policy/privateutil/PolicyUtils
197 com/sun/org/apache/xml/internal/serializer/Method
191 com/sun/xml/internal/bind/v2/WellKnownNamespace
188 java/util/Comparators
186 com/sun/org/glassfish/external/amx/AMX
174 javax/xml/transform/OutputKeys
170 java/util/Objects
170 javax/xml/XMLConstants
165 com/sun/xml/internal/ws/encoding/policy/EncodingConstants
161 com/sun/xml/internal/bind/v2/runtime/reflect/opt/OptimizedTransducedAccessorFactory
161 java/time/temporal/IsoFields
161 java/time/temporal/JulianFields
159 sun/nio/ch/sctp/MessageInfoImpl
154 com/sun/xml/internal/ws/policy/PolicyConstants
152 com/sun/xml/internal/ws/api/policy/ModelGenerator
151 com/sun/xml/internal/bind/v2/runtime/reflect/opt/OptimizedAccessorFactory
150 com/sun/org/apache/xpath/internal/objects/XStringForChars
150 com/sun/xml/internal/org/jvnet/mimepull/PropUtil
149 com/sun/xml/internal/messaging/saaj/packaging/mime/internet/MimeUtility
148 com/sun/org/glassfish/external/probe/provider/StatsProviderManager
147 com/sun/xml/internal/fastinfoset/DecoderStateTables
146 com/sun/xml/internal/messaging/saaj/packaging/mime/util/ASCIIUtility
144 javax/xml/datatype/DatatypeConstants
142 com/sun/org/apache/xml/internal/serializer/SerializerFactory
141 sun/net/ftp/FtpDirEntry
140 com/sun/org/apache/xerces/internal/impl/xpath/regex/REUtil
139 com/sun/xml/internal/bind/v2/runtime/property/PropertyFactory
139 com/sun/xml/internal/ws/config/metro/util/ParserUtil
138 com/sun/org/glassfish/gmbal/ManagedObjectManagerFactory
138 com/sun/xml/internal/bind/v2/runtime/property/Utils
137 com/sun/xml/internal/bind/v2/runtime/reflect/Utils
137 sun/instrument/InstrumentationImpl
135 com/sun/xml/internal/ws/streaming/XMLStreamReaderUtil
135 com/sun/xml/internal/ws/streaming/XMLStreamWriterUtil
134 java/lang/invoke/InvokeDynamic
134 javax/xml/xpath/XPathConstants
134 sun/invoke/empty/Empty
132 com/sun/org/apache/xerces/internal/impl/Constants
132 com/sun/xml/internal/bind/v2/model/impl/Utils
131 com/sun/xml/internal/bind/v2/model/util/ArrayInfoUtil
131 com/sun/xml/internal/ws/commons/xmlutil/Converter
130 com/sun/activation/registries/LogSupport
130 com/sun/xml/internal/org/jvnet/mimepull/ASCIIUtility
129 com/sun/xml/internal/bind/v2/runtime/Utils
129 com/sun/xml/internal/org/jvnet/mimepull/MimeUtility
129 java/util/stream/Streams
127 com/sun/xml/internal/bind/v2/bytecode/ClassTailor
126 com/sun/org/apache/xalan/internal/lib/Extensions
126 com/sun/xml/internal/ws/policy/PolicyMapUtil
124 com/sun/xml/internal/txw2/output/ResultFactory
124 java/lang/Class
123 com/sun/xml/internal/ws/spi/db/Utils
122 com/sun/xml/internal/bind/api/Utils
122 com/sun/xml/internal/ws/api/message/Messages
122 com/sun/xml/internal/ws/model/Utils
121 com/sun/xml/internal/bind/v2/schemagen/Util
121 com/sun/xml/internal/ws/api/message/Headers
120 com/sun/org/glassfish/external/amx/AMXUtil
120 javax/swing/SwingUtilities
119 com/sun/xml/internal/ws/util/ASCIIUtility
118 org/xml/sax/helpers/XMLReaderFactory
115 org/xml/sax/helpers/ParserFactory
114 javax/activation/SecuritySupport
114 javax/xml/bind/DatatypeConverter
108 com/sun/xml/internal/bind/Util
107 com/sun/xml/internal/txw2/TXW
105 java/util/stream/Nodes
97 com/sun/jmx/defaults/ServiceName
97 com/sun/jmx/snmp/ServiceName
97 com/sun/management/jmx/ServiceName
97 com/sun/org/apache/xml/internal/security/utils/Constants
97 com/sun/org/apache/xml/internal/security/utils/EncryptionConstants
97 java/util/LocaleISOData
97 javax/xml/bind/JAXB
97 sun/util/locale/provider/CollationRules
93 com/sun/corba/se/spi/logging/CORBALogDomains
93 java/awt/dnd/DnDConstants
93 java/sql/Types
93 java/util/ArrayPrefixHelpers
93 java/util/FormattableFlags
93 java/util/zip/ZipConstants64
93 sun/net/idn/UCharacterEnums
93 sun/nio/fs/WindowsConstants
90 com/sun/corba/se/impl/dynamicany/DynValueCommonImpl
81 com/sun/corba/se/impl/dynamicany/DynStructImpl
81 com/sun/corba/se/impl/dynamicany/DynValueImpl
74 com/sun/org/apache/xml/internal/dtm/ref/DTMAxisIterNodeList
73 com/sun/corba/se/impl/dynamicany/DynAnyFactoryImpl
72 com/sun/beans/finder/ClassFinder
72 com/sun/org/apache/xml/internal/security/utils/IdResolver
72 com/sun/security/sasl/util/PolicyUtils
72 java/time/temporal/TemporalAdjusters
72 sun/misc/ThreadGroupUtils
72 sun/net/idn/UCharacterDirection
72 sun/reflect/misc/ConstructorUtil
72 sun/reflect/misc/FieldUtil
72 sun/security/krb5/internal/crypto/KeyUsage
72 sun/security/rsa/SunRsaSignEntries
72 sun/util/locale/provider/CalendarDataUtility
68 com/oracle/util/Checksums
68 java/lang/ClassLoaderHelper
68 java/lang/reflect/Array
68 java/text/Normalizer
68 java/util/DualPivotQuicksort
68 sun/nio/ch/IOStatus
68 sun/text/Normalizer
66 com/sun/corba/se/impl/ior/EncapsulationUtility
66 com/sun/jmx/defaults/JmxProperties
66 com/sun/xml/internal/ws/api/pipe/Stubs
66 java/time/temporal/TemporalQueries
66 sun/awt/AWTAccessor
66 sun/io/Win32ErrorMode
66 sun/swing/SwingAccessor
65 com/sun/org/apache/xml/internal/dtm/ref/DTMChildIterNodeList
65 com/sun/org/apache/xml/internal/dtm/ref/DTMNodeList
63 com/sun/awt/AWTUtilities
63 com/sun/awt/SecurityWarning
63 com/sun/media/sound/MidiUtils
63 com/sun/org/apache/xml/internal/security/c14n/helper/C14nHelper
63 sun/corba/OutputStreamFactory
63 sun/util/locale/LocaleUtils
62 com/sun/corba/se/impl/orbutil/concurrent/SyncUtil
62 com/sun/corba/se/impl/orbutil/ORBConstants
62 com/sun/corba/se/spi/presentation/rmi/StubAdapter
62 com/sun/java/util/jar/pack/Constants
62 java/lang/Void
62 java/util/stream/Tripwire
62 java/util/Tripwire
62 sun/misc/DoubleConsts
62 sun/misc/FloatConsts
59 com/sun/corba/se/impl/orb/DataCollectorFactory
59 com/sun/corba/se/impl/orb/ParserActionFactory
59 com/sun/corba/se/impl/orbutil/ObjectUtility
59 com/sun/corba/se/spi/orb/ORBVersionFactory
59 com/sun/corba/se/spi/orbutil/closure/ClosureFactory
59 com/sun/corba/se/spi/orbutil/proxy/DelegateInvocationHandlerImpl
59 com/sun/image/codec/jpeg/JPEGCodec
59 java/rmi/registry/LocateRegistry
59 java/util/stream/DistinctOps
59 java/util/stream/ForEachOps
59 java/util/stream/MatchOps
59 java/util/stream/ReduceOps
59 java/util/stream/SortedOps
59 java/util/stream/StreamSupport
59 javax/annotation/processing/Completions
59 sun/management/ManagementFactory
59 sun/nio/ch/Reflect
59 sun/nio/ch/SocketOptionRegistry
59 sun/nio/fs/Reflect
58 com/sun/corba/se/impl/dynamicany/DynAnyBasicImpl
58 com/sun/corba/se/impl/dynamicany/DynAnyCollectionImpl
58 com/sun/corba/se/impl/dynamicany/DynAnyComplexImpl
58 com/sun/corba/se/impl/dynamicany/DynAnyConstructedImpl
58 com/sun/corba/se/impl/dynamicany/DynArrayImpl
58 com/sun/corba/se/impl/dynamicany/DynEnumImpl
58 com/sun/corba/se/impl/dynamicany/DynFixedImpl
58 com/sun/corba/se/impl/dynamicany/DynSequenceImpl
58 com/sun/corba/se/impl/dynamicany/DynUnionImpl
58 com/sun/corba/se/impl/dynamicany/DynValueBoxImpl
57 com/sun/beans/finder/PrimitiveTypeMap
57 com/sun/beans/finder/PrimitiveWrapperMap
57 com/sun/jndi/ldap/sasl/LdapSasl
57 com/sun/management/jmx/JMProperties
57 com/sun/media/sound/JSSecurityManager
57 com/sun/media/sound/Platform
57 sun/java2d/opengl/OGLUtilities
57 sun/management/jdp/JdpController
57 sun/security/jgss/krb5/Krb5Util
57 sun/security/krb5/internal/crypto/Aes128
57 sun/security/krb5/internal/crypto/Aes256
57 sun/security/krb5/internal/crypto/ArcFourHmac
57 sun/security/smartcardio/PCSC
57 sun/util/locale/provider/JRELocaleConstants
56 javax/print/StreamPrintService
53 com/oracle/net/Sdp
53 com/sun/corba/se/impl/encoding/OSFCodeSetRegistry
53 com/sun/corba/se/impl/orbutil/ORBUtility
53 com/sun/corba/se/spi/orb/OperationFactory
53 com/sun/nio/sctp/SctpStandardSocketOptions
53 java/net/StandardSocketOptions
53 java/nio/file/CopyMoveHelper
53 java/nio/file/StandardWatchEventKinds
53 jdk/net/ExtendedSocketOptions
53 sun/font/ScriptRunData
53 sun/misc/GC
53 sun/nio/fs/Globs
53 sun/nio/fs/WindowsSecurity
53 sun/security/provider/certpath/PKIX
52 com/sun/beans/finder/FieldFinder
52 com/sun/jmx/mbeanserver/Introspector
52 com/sun/jmx/snmp/defaults/DefaultPaths
52 com/sun/jmx/snmp/defaults/SnmpProperties
52 com/sun/jndi/ldap/LdapPoolManager
52 com/sun/jndi/ldap/ServiceLocator
52 com/sun/jndi/toolkit/url/UrlUtil
52 com/sun/media/sound/JDK13Services
52 com/sun/media/sound/Printer
52 com/sun/media/sound/Toolkit
52 com/sun/naming/internal/ResourceManager
52 com/sun/net/ssl/SSLSecurity
52 com/sun/org/apache/xml/internal/security/algorithms/ClassLoaderUtils
52 com/sun/org/apache/xml/internal/security/keys/KeyUtils
52 com/sun/org/apache/xml/internal/security/transforms/ClassLoaderUtils
52 com/sun/org/apache/xml/internal/security/utils/Base64
52 com/sun/org/apache/xml/internal/security/utils/ClassLoaderUtils
52 com/sun/org/apache/xml/internal/security/utils/I18n
52 com/sun/org/apache/xml/internal/security/utils/JavaUtils
52 com/sun/org/apache/xml/internal/security/utils/XMLUtils
52 java/awt/MouseInfo
52 java/lang/System
52 java/nio/file/FileSystems
52 java/security/Security
52 java/util/Collections
52 javax/management/MBeanServerFactory
52 javax/management/remote/JMXConnectorFactory
52 javax/management/remote/JMXConnectorServerFactory
52 javax/print/attribute/AttributeSetUtilities
52 javax/security/sasl/Sasl
52 javax/sound/midi/MidiSystem
52 javax/sound/sampled/AudioSystem
52 javax/swing/BorderFactory
52 jdk/management/resource/internal/ResourceNatives
52 sun/awt/OSInfo
52 sun/java2d/loops/GraphicsPrimitiveMgr
52 sun/management/jmxremote/ConnectorBootstrap
52 sun/nio/fs/WindowsFileCopy
52 sun/nio/fs/WindowsLinkSupport
52 sun/nio/fs/WindowsUriSupport
52 sun/reflect/misc/ReflectUtil
52 sun/rmi/server/Util
52 sun/security/jca/GetInstance
52 sun/security/jca/JCAUtil
52 sun/security/jca/Providers
52 sun/security/jgss/krb5/SubjectComber
52 sun/security/krb5/Confounder
52 sun/security/krb5/internal/crypto/Des3
52 sun/security/krb5/KrbServiceLocator
52 sun/security/provider/ByteArrayAccess
52 sun/security/provider/ParameterCache
52 sun/security/provider/SunEntries
52 sun/security/rsa/RSACore
52 sun/security/tools/KeyStoreUtil
52 sun/security/util/SecurityConstants
52 sun/security/validator/KeyStores
52 sun/security/x509/OIDMap
52 sun/util/calendar/ZoneInfoFile
52 sun/util/locale/provider/TimeZoneNameUtility
48 com/sun/corba/se/impl/naming/cosnaming/NamingUtils
48 com/sun/corba/se/spi/copyobject/CopyobjectDefaults
48 com/sun/corba/se/spi/ior/iiop/IIOPFactories
48 com/sun/corba/se/spi/ior/IORFactories
48 com/sun/corba/se/spi/orbutil/fsm/StateEngineFactory
48 com/sun/corba/se/spi/presentation/rmi/PresentationDefaults
48 com/sun/corba/se/spi/protocol/RequestDispatcherDefault
48 com/sun/corba/se/spi/transport/TransportDefault
48 com/sun/java/util/jar/pack/ConstantPool
48 com/sun/java/util/jar/pack/Utils
48 com/sun/jmx/remote/internal/IIOPHelper
48 com/sun/jndi/cosnaming/ExceptionMapper
48 com/sun/jndi/ldap/Obj
48 java/awt/dnd/SerializationTester
48 java/io/DeleteOnExitHook
48 java/lang/ApplicationShutdownHooks
48 java/lang/Compiler
48 java/lang/invoke/MethodHandleNatives
48 java/lang/invoke/MethodHandleProxies
48 java/lang/invoke/MethodHandles
48 java/lang/invoke/MethodHandleStatics
48 java/lang/management/ManagementFactory
48 java/lang/Math
48 java/lang/StrictMath
48 java/lang/StringCoding
48 java/net/IDN
48 java/net/URLEncoder
48 java/nio/Bits
48 java/nio/channels/Channels
48 java/nio/file/attribute/PosixFilePermissions
48 java/nio/file/Files
48 java/nio/file/Paths
48 java/nio/file/TempFileHelper
48 java/rmi/Naming
48 java/rmi/server/RMIClassLoader
48 java/security/AccessController
48 java/util/Arrays
48 java/util/Base64
48 java/util/concurrent/Executors
48 java/util/concurrent/locks/LockSupport
48 java/util/jar/Pack200
48 java/util/Spliterators
48 java/util/stream/Collectors
48 java/util/stream/FindOps
48 java/util/stream/SliceOps
48 javax/imageio/ImageIO
48 javax/lang/model/util/ElementFilter
48 javax/rmi/CORBA/Util
48 javax/swing/colorchooser/ColorChooserComponentFactory
48 jdk/net/Sockets
48 org/jcp/xml/dsig/internal/dom/DOMUtils
48 org/jcp/xml/dsig/internal/dom/Utils
48 sun/awt/ScrollPaneWheelScroller
48 sun/invoke/util/BytecodeDescriptor
48 sun/invoke/util/BytecodeName
48 sun/invoke/util/VerifyAccess
48 sun/invoke/util/VerifyType
48 sun/management/ExtendedPlatformComponent
48 sun/management/ManagementFactoryHelper
48 sun/management/Util
48 sun/misc/FpUtils
48 sun/misc/Service
48 sun/net/ExtendedOptionsImpl
48 sun/net/NetProperties
48 sun/net/sdp/SdpSupport
48 sun/nio/ch/DefaultAsynchronousChannelProvider
48 sun/nio/ch/DefaultSelectorProvider
48 sun/nio/ch/ExtendedSocketOption
48 sun/nio/ch/Invoker
48 sun/nio/ch/IOUtil
48 sun/nio/ch/Net
48 sun/nio/ch/Secrets
48 sun/nio/cs/Surrogate
48 sun/nio/fs/DefaultFileSystemProvider
48 sun/nio/fs/DefaultFileTypeDetector
48 sun/nio/fs/NativeBuffers
48 sun/nio/fs/Util
48 sun/nio/fs/WindowsChannelFactory
48 sun/nio/fs/WindowsNativeDispatcher
48 sun/nio/fs/WindowsPathParser
48 sun/nio/fs/WindowsUserPrincipals
48 sun/print/CustomMediaSizeName
48 sun/print/CustomMediaTray
48 sun/rmi/server/LoaderHandler
48 sun/rmi/transport/DGCClient
48 sun/rmi/transport/proxy/CGIHandler
48 sun/security/provider/certpath/DistributionPointFetcher
48 sun/security/provider/certpath/OCSP
48 sun/security/util/ECUtil
48 sun/security/util/UntrustedCertificates
48 sun/util/locale/LocaleMatcher
48 sun/util/logging/LoggingSupport
47 com/sun/corba/se/impl/protocol/CorbaInvocationInfo
47 java/lang/reflect/Proxy
43 com/sun/corba/se/impl/naming/cosnaming/TransientNameServer
43 com/sun/corba/se/impl/orbutil/CacheTable
43 java/sql/DriverManager
43 sun/rmi/transport/ObjectTable
27804
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment