2017-10-01 4 views
1

Je cherche à rendre la dynamique appel de méthode suivante:Comment obtenir une référence de classe par nom de chaîne?

JobDetail job = newJob(RunMeJob.class) 
        .withIdentity("myJob", "group1") 
        .build(); 

En procédant comme suit:

private void scheduleJob(final SchedulerJob job, final SchedulerTrigger trigger) { 

    final String fullyQualifiedName = "com.crm.scheduler.job.RunMeJob";//"com.crm.scheduler.job" + job.getImplementation(); 

    Class<?> cls = Class.forName(fullyQualifiedName, false, null); 

    JobDetail jobDetail = newJob(cls) 
       .withIdentity(job.getExternalReference(), trigger.getExternalReference()) 
       .build(); 
} 

Mais je reçois l'erreur suivante:

The method newJob(Class< ? extends Job>) in the type JobBuilder is not applicable for the arguments (Class< capture#3-of ?>)

Voici la RunMeJob classe:

package com.crm.scheduler.job; 

import org.quartz.Job; 
import org.quartz.JobExecutionContext; 
import org.quartz.JobExecutionException; 
import org.springframework.stereotype.Component; 

import com.crm.scheduler.task.RunMeTask; 

@Component 
public class RunMeJob implements Job { 

    @Override 
    public void execute(JobExecutionContext arg0) throws JobExecutionException { 
     new RunMeTask().printMe(); 
    } 
} 

Comment puis-je spécifier dynamiquement la classe?

+0

Pouvez-vous partager la signature de 'newJob' s'il vous plaît? – Mureinik

Répondre

1

Vous avez la bonne idée, au fond, mais vous ne pouvez pas passer un objet quelconque Class à la méthode newJob - il doit être une instance Class qui représentent un Job, et doit être spécifié comme tel dans ses génériques:

Class<? extends Job> cls = 
    (Class<Job>) Class.forName(fullyQualifiedName, false, null);