Here you can find the source of newInstanceViaAnnotation(Class> declarator, Annotation annotation, Class
@SuppressWarnings("unchecked") public static <T> T newInstanceViaAnnotation(Class<?> declarator, Annotation annotation, Class<T> expected, Annotation parameter)
//package com.java2s; /******************************************************************************* * Copyright (c) 2012 itemis AG (http://www.itemis.eu) and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Main { @SuppressWarnings("unchecked") public static <T> T newInstanceViaAnnotation(Class<?> declarator, Annotation annotation, Class<T> expected, Annotation parameter) { if (annotation != null) for (Method f : annotation.annotationType().getDeclaredMethods()) if (f.getReturnType() == Class.class) { try { Object objtype = f.invoke(annotation); if (objtype instanceof Class<?> && expected.isAssignableFrom((Class<?>) objtype)) { T result = newInstance((Class<T>) objtype, declarator, parameter); if (result != null) return result; }// ww w . java 2 s . c om } catch (IllegalArgumentException e) { } catch (IllegalAccessException e) { } catch (InvocationTargetException e) { throw new RuntimeException(e); } } return null; } public static <T> T newInstanceViaAnnotation(Class<?> declarator, Class<? extends Annotation> AnnotationClass, Class<T> expected) { Annotation annotation = declarator.getAnnotation(AnnotationClass); return newInstanceViaAnnotation(declarator, annotation, expected, annotation); } @SuppressWarnings("unchecked") public static <T> T newInstance(Class<T> type, Class<?> declarator, Annotation annotation) throws IllegalAccessException { if (declarator != null) try { Constructor<?> c = type.getDeclaredConstructor(declarator.getClass(), annotation.annotationType()); c.setAccessible(true); if (c != null) return (T) c.newInstance(declarator, annotation); } catch (SecurityException e) { } catch (NoSuchMethodException e) { } catch (InstantiationException e) { } catch (InvocationTargetException e) { throw new RuntimeException(e); } try { Constructor<?> c = type.getConstructor(annotation.annotationType()); if (c != null) return (T) c.newInstance(annotation); } catch (SecurityException e) { } catch (NoSuchMethodException e) { } catch (InstantiationException e) { } catch (InvocationTargetException e) { throw new RuntimeException(e); } try { Constructor<?> c = type.getConstructor(); if (c != null) return (T) c.newInstance(); } catch (SecurityException e) { } catch (NoSuchMethodException e) { } catch (InstantiationException e) { } catch (InvocationTargetException e) { throw new RuntimeException(e); } return null; } }