import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Reflect {

    static Object virtualThreadFactory;
    static Method newThread;

    public static void main(String[] args) {
        try {
            Class c = Class.forName("java.lang.Thread");
            Method ofVirtualMethod = c.getMethod("ofVirtual");
            Object threadBuilderOfVirtual = ofVirtualMethod.invoke(null);
            Class factoryMethodClass = threadBuilderOfVirtual.getClass();
            Method factoryMethod = factoryMethodClass.getMethod("factory");
            Class virtualThreadFactoryClass = Class.forName("java.lang.ThreadBuilders$VirtualThreadFactory");
            virtualThreadFactory = factoryMethod.invoke(virtualThreadFactoryClass, (Object[]) null);
            newThread = virtualThreadFactory.getClass().getMethod("newThread");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Reflect.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoSuchMethodException ex) {
            Logger.getLogger(Reflect.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SecurityException ex) {
            Logger.getLogger(Reflect.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(Reflect.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvocationTargetException ex) {
            Logger.getLogger(Reflect.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
} 