// Path: src/main/java/ru/vyarus/guice/ext/core/method/MethodPostProcessor.java
// public interface MethodPostProcessor<T extends Annotation> {
// 
//     /**
//      * Called to post process annotated bean method.
//      * It is safe to avoid explicit exception handling (except special cases required by processor logic).
//      *
//      * @param annotation annotation instance
//      * @param method     annotated method
//      * @param instance   bean instance
//      * @throws Exception on any unrecoverable error
//      * @see ru.vyarus.guice.ext.core.method.AnnotatedMethodTypeListener
//      */
//     void process(T annotation, Method method, Object instance) throws Exception;
// }
// 
// Path: src/main/java/ru/vyarus/guice/ext/core/util/Utils.java
// public final class Utils {
// 
//     private Utils() {
//     }
// 
//     /**
//      * Important check, because JDK proxies of public interfaces have no package
//      * (thanks to @binkley https://github.com/99soft/lifegycle/pull/5).
//      *
//      * @param type class type to check
//      * @return true if package could be resolved, false otherwise
//      */
//     public static boolean isPackageValid(final Class type) {
//         boolean res = false;
//         if (type != null) {
//             final Package packaj = type.getPackage();
//             res = !(packaj == null || packaj.getName().startsWith("java"));
//         }
//         return res;
//     }
// 
//     /**
//      * Checks that method has no parameters, otherwise throws exception.
//      *
//      * @param method method to check
//      */
//     public static void checkNoParams(final Method method) {
//         if (method.getParameterTypes().length > 0) {
//             throw new IllegalStateException("Method without parameters required");
//         }
//     }
// 
//     /**
//      * Note: versions below 1.8 are not supported.
//      *
//      * @return true if current java is 1.8, otherwise assumed 9 or above
//      */
//     public static boolean isJava8() {
//         final String version = System.getProperty("java.version");
//         return version.startsWith("1.8");
//     }
// }


import ru.vyarus.guice.ext.core.method.MethodPostProcessor;
import ru.vyarus.guice.ext.core.util.Utils;
import javax.annotation.PostConstruct;
import java.lang.reflect.Method;
package ru.vyarus.guice.ext.managed;



/**
 * Process bean @PostConstruct annotated methods: executes annotated method just after bean initialization.
 *
 * @author Vyacheslav Rusakov
 * @since 30.06.2014
 */
public class PostConstructAnnotationProcessor implements MethodPostProcessor<PostConstruct> {

    @Override
    public void process(final PostConstruct annotation, final Method method, final Object instance) throws Exception {
        Utils.checkNoParams(method);
// Path: src/main/java/ru/vyarus/guice/ext/core/method/MethodPostProcessor.java
// public interface MethodPostProcessor<T extends Annotation> {
// 
//     /**
//      * Called to post process annotated bean method.
//      * It is safe to avoid explicit exception handling (except special cases required by processor logic).
//      *
//      * @param annotation annotation instance
//      * @param method     annotated method
//      * @param instance   bean instance
//      * @throws Exception on any unrecoverable error
//      * @see ru.vyarus.guice.ext.core.method.AnnotatedMethodTypeListener
//      */
//     void process(T annotation, Method method, Object instance) throws Exception;
// }
// 
// Path: src/main/java/ru/vyarus/guice/ext/core/util/Utils.java
// public final class Utils {
// 
//     private Utils() {
//     }
// 
//     /**
//      * Important check, because JDK proxies of public interfaces have no package
//      * (thanks to @binkley https://github.com/99soft/lifegycle/pull/5).
//      *
//      * @param type class type to check
//      * @return true if package could be resolved, false otherwise
//      */
//     public static boolean isPackageValid(final Class type) {
//         boolean res = false;
//         if (type != null) {
//             final Package packaj = type.getPackage();
//             res = !(packaj == null || packaj.getName().startsWith("java"));
//         }
//         return res;
//     }
// 
//     /**
//      * Checks that method has no parameters, otherwise throws exception.
//      *
//      * @param method method to check
//      */
//     public static void checkNoParams(final Method method) {
//         if (method.getParameterTypes().length > 0) {
//             throw new IllegalStateException("Method without parameters required");
//         }
//     }
// 
//     /**
//      * Note: versions below 1.8 are not supported.
//      *
//      * @return true if current java is 1.8, otherwise assumed 9 or above
//      */
//     public static boolean isJava8() {
//         final String version = System.getProperty("java.version");
//         return version.startsWith("1.8");
//     }
// }


// Path: src/main/java/ru/vyarus/guice/ext/managed/PostConstructAnnotationProcessor.java
import ru.vyarus.guice.ext.core.method.MethodPostProcessor;
import ru.vyarus.guice.ext.core.util.Utils;
import javax.annotation.PostConstruct;
import java.lang.reflect.Method;

package ru.vyarus.guice.ext.managed;



/**
 * Process bean @PostConstruct annotated methods: executes annotated method just after bean initialization.
 *
 * @author Vyacheslav Rusakov
 * @since 30.06.2014
 */
public class PostConstructAnnotationProcessor implements MethodPostProcessor<PostConstruct> {

    @Override
    public void process(final PostConstruct annotation, final Method method, final Object instance) throws Exception {
        Utils.checkNoParams(method);
        method.invoke(instance);