Class ClassFileUtils


  • public class ClassFileUtils
    extends Object
    Utility class for loading a ClassFile into a classloader. Allows to use either old approach directly via CL methods, or delegation to integrator through ProxyServices. Also contains logic needed to crack open CL methods should that approach be used - this is invoked from WeldStartup. As we need to be able to define classes with different ProtectionDomain, we still have to crack open CL methods via setAccessible() which means there will be IllegalAccess warnings. Unsafe is no longer an option on JDK 12+.. This mostly concerns Weld SE, EE integrators should already go through new SPI hence avoiding this problem.
    Author:
    Stuart Douglas, Matej Novotny
    • Method Detail

      • makeClassLoaderMethodsAccessible

        public static void makeClassLoaderMethodsAccessible()
        This method cracks open ClassLoader#defineClass() methods by calling setAccessible(). It is invoked during WeldStartup#startContainer() and only in case the integrator does not fully implement ProxyServices.
      • toClass

        public static Class<?> toClass​(org.jboss.classfilewriter.ClassFile ct,
                                       ClassLoader loader,
                                       ProtectionDomain domain)
        Converts the class to a java.lang.Class object. Once this method is called, further modifications are not allowed any more.

        The class file represented by the given CtClass is loaded by the given class loader to construct a java.lang.Class object. Since a private method on the class loader is invoked through the reflection API, the caller must have permissions to do that.

        An easy way to obtain ProtectionDomain object is to call getProtectionDomain() in java.lang.Class. It returns the domain that the class belongs to.

        This method is provided for convenience. If you need more complex functionality, you should write your own class loader.

        Parameters:
        loader - the class loader used to load this class. For example, the loader returned by getClassLoader() can be used for this parameter.
        domain - the protection domain for the class. If it is null, the default domain created by java.lang.ClassLoader is
      • toClass

        public static Class<?> toClass​(org.jboss.classfilewriter.ClassFile ct,
                                       Class<?> originalClass,
                                       org.jboss.weld.serialization.spi.ProxyServices proxyServices,
                                       ProtectionDomain domain)
        Delegates proxy creation via ProxyServices to the integrator.