Java Class New Instance newInstanceViaAnnotation(Class declarator, Annotation annotation, Class expected, Annotation parameter)

Here you can find the source of newInstanceViaAnnotation(Class declarator, Annotation annotation, Class expected, Annotation parameter)

Description

new Instance Via Annotation

License

Open Source License

Declaration

@SuppressWarnings("unchecked")
    public static <T> T newInstanceViaAnnotation(Class<?> declarator, Annotation annotation, Class<T> expected,
            Annotation parameter) 

Method Source Code

//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;
    }
}

Related

  1. newInstanceHard(String name)
  2. newInstanceOf(Class clazz)
  3. newInstanceOf(String className)
  4. newInstanceOrThrow(final Class clazz)
  5. newInstancesViaMetaAnnotation(Class declarator, Class metaAnnotationClass, Class expected)
  6. newInstanceWithDefaults(Class annotationType)
  7. newInstanceWithFill(Class componentType, int length, Object filledValue)
  8. newInstanceWithoutInit(Class clazz)
  9. newInstanceWithParameterTypes(Constructor constructor)