Generics = Fazer com uma Class clazz seja definida em tempo de execução como OneToMany.class

Olá a todos. O Código abaixo funciona, porém sei que estou tendo re-trabalho por nada. Então envio o código para saber se alguém poderia ajudar a “encurta-lo”.

Métodos que fazem alguma coisa dependendo se é OneToOne.class ou ManyToOne.class e etc.

/**
	 * Generate '@ManyToMany' Annotation
	 */
	public String generateManyToManyRelationshipElement(Annotation annotation) {
		// Relationship Pattern
		String relationshipBasicPattern = "@ManyToMany("; 

		// Treat of annotation's parameters
		if ((((ManyToMany) annotation).fetch().toString().equalsIgnoreCase("EAGER")) 
				|| (((ManyToMany) annotation).fetch().toString().equalsIgnoreCase("LAZY"))) {
			relationshipBasicPattern = relationshipBasicPattern + "fetch=FetchType." + ((ManyToMany) annotation).fetch() + ", ";
		}

		if ((((ManyToMany) annotation).cascade().length != 0)) {
			String cascade = "cascade= {";
			for (CascadeType cascadeType : ((ManyToMany) annotation).cascade()) {
				cascade = cascade + "CascadeType." + cascadeType.toString() + ", ";
			}

			if (cascade.endsWith(", ")) {
				String finalcascade = cascade.substring(0, cascade.length()-1) + "}";
				relationshipBasicPattern = relationshipBasicPattern + finalcascade + ", ";
			} else {
				cascade = cascade + "}";
				relationshipBasicPattern = relationshipBasicPattern + cascade + ", ";
			}
		}

		if (((ManyToMany) annotation).mappedBy().length() != 0) {
			relationshipBasicPattern = relationshipBasicPattern + "mappedBy=" + ((ManyToMany) annotation).mappedBy() + ", ";
		}

		if (!((ManyToMany) annotation).targetEntity().getSimpleName().equalsIgnoreCase("void")) {
			relationshipBasicPattern = relationshipBasicPattern + "targetEntity=" + ((ManyToMany) annotation).targetEntity().getSimpleName() + ".class)";
		}

		if (relationshipBasicPattern.endsWith(", ")) {
			String finalrelationshipBasicPattern = relationshipBasicPattern.substring(0, relationshipBasicPattern.length()-2) + ")";
			return finalrelationshipBasicPattern;
		} else {
			return relationshipBasicPattern;
		}
	}

	// Generate the @ManyToOne Element's Annotations
	
	// Generate @ManyToOne Annotation
	
	/**
	 * Generate '@ManyToOne' Annotation
	 */
	public String generateManyToOneRelationshipElement(Annotation annotation) {
		// Relationship Pattern
		String relationshipBasicPattern = "@ManyToOne("; 

		// Treat of empty annotation's parameters
		// @ManyToMany(fetch=EAGER, mappedBy=joão, targetEntity=class br.com.link3.l3studio.modelos.Entidade)

		if ((((ManyToOne) annotation).fetch().toString().equalsIgnoreCase("EAGER")) 
				|| (((ManyToOne) annotation).fetch().toString().equalsIgnoreCase("LAZY"))) {
			relationshipBasicPattern = relationshipBasicPattern + "fetch=FetchType." + ((ManyToOne) annotation).fetch() + ", ";
		}

		if ((((ManyToOne) annotation).cascade().length != 0)) {
			String cascade = "cascade= {";
			for (CascadeType cascadeType : ((ManyToOne) annotation).cascade()) {
				cascade = cascade + "CascadeType." + cascadeType.toString() + ", ";
			}

			if (cascade.endsWith(", ")) {
				String finalcascade = cascade.substring(0, cascade.length()-1) + "}";
				relationshipBasicPattern = relationshipBasicPattern + finalcascade + ", ";
			} else {
				cascade = cascade + "}";
				relationshipBasicPattern = relationshipBasicPattern + cascade + ", ";
			}
		}

		if ((((ManyToOne) annotation).optional() == false) 
				|| (((ManyToOne) annotation).optional() == true)) {
			relationshipBasicPattern = relationshipBasicPattern + "optional=" +((ManyToOne) annotation).optional() + ", ";
		}

		if (!((ManyToOne) annotation).targetEntity().getSimpleName().equalsIgnoreCase("void")) {
			relationshipBasicPattern = relationshipBasicPattern + "targetEntity=" + ((ManyToOne) annotation).targetEntity().getSimpleName() + ".class)";
		}

		if (relationshipBasicPattern.endsWith(", ")) {
			String finalrelationshipBasicPattern = relationshipBasicPattern.substring(0, relationshipBasicPattern.length()-2) + ")";
			return finalrelationshipBasicPattern;
		} else {
			return relationshipBasicPattern;
		}
	}

	// Generate the @OneToMany Elements Annotation
	
	// Generate @OneToMany Annotation
	
	/**
	 * Generate '@OneToMany' Annotation
	 */
	public String generateOneToManyRelationshipElement(Annotation annotation) {
		// Relationship Pattern
		String relationshipBasicPattern = "@OneToMany("; 

		// Treat of empty annotation's parameters

		if ((((OneToMany) annotation).fetch().toString().equalsIgnoreCase("EAGER")) 
				|| (((OneToMany) annotation).fetch().toString().equalsIgnoreCase("LAZY"))) {
			relationshipBasicPattern = relationshipBasicPattern + "fetch=FetchType." + ((OneToMany) annotation).fetch() + ", ";
		}

		if ((((OneToMany) annotation).cascade().length != 0)) {
			String cascade = "cascade= {";
			for (CascadeType cascadeType : ((OneToMany) annotation).cascade()) {
				cascade = cascade + "CascadeType." + cascadeType.toString() + ", ";
			}

			if (cascade.endsWith(", ")) {
				String finalcascade = cascade.substring(0, cascade.length()-1) + "}";
				relationshipBasicPattern = relationshipBasicPattern + finalcascade + ", ";
			} else {
				cascade = cascade + "}";
				relationshipBasicPattern = relationshipBasicPattern + cascade + ", ";
			}
		}

		if ((((OneToMany) annotation).mappedBy().length() != 0)) {
			relationshipBasicPattern = relationshipBasicPattern + "mappedBy=" + ((OneToMany) annotation).mappedBy() + ", ";
		}

		if (!((OneToMany) annotation).targetEntity().getSimpleName().equalsIgnoreCase("void")) {
			relationshipBasicPattern = relationshipBasicPattern + "targetEntity=" + ((OneToMany) annotation).targetEntity().getSimpleName() + ".class)";
		}

		if (relationshipBasicPattern.endsWith(", ")) {
			String finalrelationshipBasicPattern = relationshipBasicPattern.substring(0, relationshipBasicPattern.length()-2) + ")";
			return finalrelationshipBasicPattern;
		} else {
			return relationshipBasicPattern;
		}
	}

	// Generate the @OneToOne Elements Annotation
	
	// Generate @OneToOne Annotation
	
	/**
	 * Generate '@OneToOne' Annotation
	 */
	public String generateOneToOneRelationshipElement(Annotation annotation) {
		// Relationship Pattern
		String relationshipBasicPattern = "@OneToOne("; 

		// Treat of empty annotation's parameters

		if ((((OneToOne) annotation).fetch().toString().equalsIgnoreCase("EAGER")) 
				|| (((OneToOne) annotation).fetch().toString().equalsIgnoreCase("LAZY"))) {
			relationshipBasicPattern = relationshipBasicPattern + "fetch=FetchType." + ((OneToOne) annotation).fetch() + ", ";
		}

		if ((((OneToOne) annotation).cascade().length != 0)) {
			String cascade = "cascade= {";
			for (CascadeType cascadeType : ((OneToOne) annotation).cascade()) {
				cascade = cascade + "CascadeType." + cascadeType.toString() + ", ";
			}

			if (cascade.endsWith(", ")) {
				String finalcascade = cascade.substring(0, cascade.length()-1) + "}";
				relationshipBasicPattern = relationshipBasicPattern + finalcascade + ", ";
			} else {
				cascade = cascade + "}";
				relationshipBasicPattern = relationshipBasicPattern + cascade + ", ";
			}
		}

		if ((((OneToOne) annotation).mappedBy().length() != 0)) {
			relationshipBasicPattern = relationshipBasicPattern + "mappedBy=" + ((OneToOne) annotation).mappedBy() + ", ";
		}

		if (!((OneToOne) annotation).targetEntity().getSimpleName().equalsIgnoreCase("void")) {
			relationshipBasicPattern = relationshipBasicPattern + "targetEntity=" + ((OneToOne) annotation).targetEntity().getSimpleName() + ".class)";
		}

		if (relationshipBasicPattern.endsWith(", ")) {
			String finalrelationshipBasicPattern = relationshipBasicPattern.substring(0, relationshipBasicPattern.length()-2) + ")";
			return finalrelationshipBasicPattern;
		} else {
			return relationshipBasicPattern;
		}
	}

Eu queria que fosse algo como:


public String [b]generateRelationshipElement[/b](Annotation annotation, Class clazz) {
		// Relationship Pattern
		String relationshipBasicPattern = "@OneToOne("; 

		// Treat of empty annotation's parameters

		if ((((clazz) annotation).fetch().toString().equalsIgnoreCase("EAGER")) 
				|| (((clazz) annotation).fetch().toString().equalsIgnoreCase("LAZY"))) {
			relationshipBasicPattern = relationshipBasicPattern + "fetch=FetchType." + ((clazz) annotation).fetch() + ", ";
		}

		if ((((clazz) annotation).cascade().length != 0)) {
			String cascade = "cascade= {";
			for (CascadeType cascadeType : ((clazz) annotation).cascade()) {
				cascade = cascade + "CascadeType." + cascadeType.toString() + ", ";
			}

			if (cascade.endsWith(", ")) {
				String finalcascade = cascade.substring(0, cascade.length()-1) + "}";
				relationshipBasicPattern = relationshipBasicPattern + finalcascade + ", ";
			} else {
				cascade = cascade + "}";
				relationshipBasicPattern = relationshipBasicPattern + cascade + ", ";
			}
		}

		if ((((clazz) annotation).mappedBy().length() != 0)) {
			relationshipBasicPattern = relationshipBasicPattern + "mappedBy=" + ((clazz) annotation).mappedBy() + ", ";
		}

		if (!((clazz) annotation).targetEntity().getSimpleName().equalsIgnoreCase("void")) {
			relationshipBasicPattern = relationshipBasicPattern + "targetEntity=" + ((clazz) annotation).targetEntity().getSimpleName() + ".class)";
		}

		if (relationshipBasicPattern.endsWith(", ")) {
			String finalrelationshipBasicPattern = relationshipBasicPattern.substring(0, relationshipBasicPattern.length()-2) + ")";
			return finalrelationshipBasicPattern;
		} else {
			return relationshipBasicPattern;
		}
	}

E chamar esse método com algo como:

public void createElementsAnnotations(Elemento elemento) {	
		// Iterate over Field Annotations
		for (Annotation annotation : elemento.getAnnotations()) {
			// Needed to Get the Class of the Annotation
			Class clazz = annotation.annotationType();

			// Analyze the Annotation
			if (((clazz.getSimpleName().equalsIgnoreCase("ManyToMany")))) { 
                                [b]generateRelationshipElement(annotation, clazz);[/b]
			} else if (((clazz.getSimpleName().equalsIgnoreCase("ManyToOne")))) { 
                                [b]generateRelationshipElement(annotation, clazz);[/b]
			} else if (((clazz.getSimpleName().equalsIgnoreCase("OneToMany")))) { 
                                [b]generateRelationshipElement(annotation, clazz);[/b]
			} else if (((clazz.getSimpleName().equalsIgnoreCase("OneToOne")))) { 
                                [b]generateRelationshipElement(annotation, clazz);[/b]
			} 	elementAnnotationSet.add(annotation.toString());
		}
	}

Obrigado!