public static boolean jobExists(String jobSignature) {
        if (jobSignature.startsWith("java.") || jobSignature.startsWith("javax."))
            return true; // we assume that JDK classes don't change often

        try {
            String clazzAndMethod = getFQClassNameAndMethod(jobSignature);
            String clazzName = getFQClassName(clazzAndMethod);
            String method = getMethodName(clazzAndMethod);

            Class<Object> clazz = toClass(clazzName);
            Class<?>[] jobParameterTypes = getParameterTypes(jobSignature);
            return findMethod(clazz, method, jobParameterTypes).isPresent();
        } catch (IllegalArgumentException e) {
            return false;
        }
    }
@Test
    void jobExists() {
        assertThat(JobUtils.jobExists("org.jobrunr.stubs.TestService.doWork(java.util.UUID)")).isTrue();
        assertThat(JobUtils.jobExists("org.jobrunr.stubs.TestService.getProcessedJobs()")).isTrue();
        assertThat(JobUtils.jobExists("org.jobrunr.stubs.TestService.doWorkThatTakesLong(java.lang.Integer)")).isTrue();
        assertThat(JobUtils.jobExists("org.jobrunr.stubs.TestService.doWork(java.lang.Integer,java.lang.Integer)")).isTrue();
        assertThat(JobUtils.jobExists("java.lang.System.out.println(java.lang.String)")).isTrue();
        assertThat(JobUtils.jobExists("javax.sql.DataSource.getConnection()")).isTrue();

        assertThat(JobUtils.jobExists("org.jobrunr.stubs.TestServiceThatDoesNotExist.doWork(java.lang.Integer,java.lang.Integer)")).isFalse();
        assertThat(JobUtils.jobExists("org.jobrunr.stubs.TestService.methodThatDoesNotExist(java.lang.Integer,java.lang.Integer)")).isFalse();
        assertThat(JobUtils.jobExists("org.jobrunr.stubs.TestService.doWork(java.util.UUID,org.jobrunr.stubs.JobParameterThatDoesNotExist)")).isFalse();
        assertThat(JobUtils.jobExists("org.jobrunr.stubs.TestService.doWork(java.lang.Integer,java.lang.Integer,java.lang.Integer,java.lang.Integer)")).isFalse(); // too many parameters
    }