原本是想爲安卓開發一套能夠依賴注入的標籤,可是發現安卓很難找到選定包內的java或者class文件。因此只能當作學習參考了,全套代碼以下java
package com.guanjian.annotion; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Created by Administrator on 2018-06-11. */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Autowired { }
package com.guanjian.annotion; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Created by Administrator on 2018-06-11. */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Component { }
package com.guanjian.annotion; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Created by Administrator on 2018-06-11. */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface PostConstruct { }
package com.guanjian.util; import com.guanjian.utils.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.net.JarURLConnection; import java.net.URL; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; import java.util.jar.JarEntry; import java.util.jar.JarFile; /** * 類操做工具類 * Created by Administrator on 2018-06-11. */ public final class ClassUtil { private static final Logger LOGGER = LoggerFactory.getLogger(ClassUtil.class); /** * 獲取類加載器 * @return */ public static ClassLoader getClassLoader() { return Thread.currentThread().getContextClassLoader(); } /** * 加載類 * @param className * @param isInitialized * @return */ public static Class<?> loadClass(String className,boolean isInitialized) { Class<?> cls; try { cls = Class.forName(className,isInitialized,getClassLoader()); } catch (ClassNotFoundException e) { LOGGER.error("load class failure",e); throw new RuntimeException(e); } return cls; } /** * 獲取制定包名下的全部類 * @param packageName * @return */ public static Set<Class<?>> getClassSet(String packageName) { Set<Class<?>> classSet = new HashSet<Class<?>>(); try { Enumeration<URL> urls = getClassLoader().getResources(packageName.replace(".","/")); while (urls.hasMoreElements()) { URL url = urls.nextElement(); if (url != null) { String protocol = url.getProtocol(); if (protocol.equals("file")) { String packagePath = url.getPath().replaceAll("%20"," "); addClass(classSet,packagePath,packageName); }else if (protocol.equals("jar")) { JarURLConnection jarURLConnection = (JarURLConnection)url.openConnection(); if (jarURLConnection != null) { JarFile jarFile = jarURLConnection.getJarFile(); if (jarFile != null) { Enumeration<JarEntry> jarEntries = jarFile.entries(); while (jarEntries.hasMoreElements()) { JarEntry jarEntry = jarEntries.nextElement(); String jarEntryName = jarEntry.getName(); if (jarEntryName.endsWith(".class")) { String className = jarEntryName.substring(0,jarEntryName.lastIndexOf(".")).replaceAll("/","."); doAddClass(classSet,className); } } } } } } } } catch (Exception e) { LOGGER.error("get class set failure",e); throw new RuntimeException(e); } return classSet; } private static void addClass(Set<Class<?>> classSet, String packagePath, final String packageName) { File[] files = new File(packagePath).listFiles(new FileFilter() { public boolean accept(File pathname) { return (pathname.isFile() && pathname.getName().endsWith(".class")) || pathname.isDirectory(); } }); for (File file:files) { String fileName = file.getName(); if (file.isFile()) { String className = fileName.substring(0,fileName.lastIndexOf(".")); if (StringUtil.isNotEmpty(packagePath)) { className = packageName + "." + className; } doAddClass(classSet,className); }else { String subPackagePath = fileName; if (StringUtil.isNotEmpty(packagePath)) { subPackagePath = packagePath + "/" +subPackagePath; } String subPackageName = fileName; if (StringUtil.isNotEmpty(packageName)) { subPackageName = packageName + "." +subPackageName; } addClass(classSet,subPackagePath,subPackageName); } } } private static void doAddClass(Set<Class<?>> classSet,String className) { Class<?> cls = loadClass(className,false); classSet.add(cls); } }
package com.guanjian.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; /** * 反射工具類 * Created by Administrator on 2018-06-11. */ public final class ReflectionUtil { private static final Logger LOGGER = LoggerFactory.getLogger(ReflectionUtil.class); /** * 建立實例 * @param cls * @return */ public static Object newInstance(Class<?> cls) { Object instance; try { instance = cls.newInstance(); } catch (Exception e) { LOGGER.error("new instance failure",e); throw new RuntimeException(e); } return instance; } /** * 設置成員變量值 * @param obj * @param field * @param value */ public static void setField(Object obj, Field field,Object value) { try { field.setAccessible(true); field.set(obj,value); } catch (IllegalAccessException e) { LOGGER.error("set field failure",e); throw new RuntimeException(e); } } }
package com.guanjian.util; import com.guanjian.annotion.Component; import java.util.HashSet; import java.util.Set; /** * 類操做助手類 * Created by Administrator on 2018-06-11. */ public final class ClassHelper { /** * 定義類集合(用於存放所加載的類) * @param basePackage */ private static Set<Class<?>> CLASS_SET; /** * 掃描全部的包,獲取類集合放入CLASS_SET * @param basePackage */ public static void setClassSet(String basePackage) { CLASS_SET = ClassUtil.getClassSet(basePackage); } /** * 獲取應用包名下的全部類 * @return */ public static Set<Class<?>> getClassSet() { return CLASS_SET; } /** * 獲取應用包名下全部Comonent類 * @return */ public static Set<Class<?>> getComponentClassSet() { Set<Class<?>> classSet = new HashSet<Class<?>>(); for (Class<?> cls:CLASS_SET) { if (cls.isAnnotationPresent(Component.class)) { classSet.add(cls); } } return classSet; } /** * 獲取應用包名下全部Bean類 * @return */ public static Set<Class<?>> getBeanClassSet() { Set<Class<?>> beanClassSet = new HashSet<Class<?>>(); beanClassSet.addAll(getComponentClassSet()); return beanClassSet; } }
package com.guanjian.util; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * Bean助手類 * Created by Administrator on 2018-06-11. */ public final class BeanHelper { /** * 定義Bean映射(用於存放Bean類與Bean實例的映射關係) */ private static final Map<Class<?>,Object> BEAN_MAP = new HashMap<Class<?>, Object>(); /** * 獲取全部的映射關係 */ public static void setBeanMap() { Set<Class<?>> beanClassSet = ClassHelper.getBeanClassSet(); for (Class<?> beanClass:beanClassSet) { Object obj = ReflectionUtil.newInstance(beanClass); BEAN_MAP.put(beanClass,obj); } } /** * 獲取Bean映射 * @return */ public static Map<Class<?>,Object> getBeanMap() { return BEAN_MAP; } /** * 獲取Bean實例 * @param cls * @param <T> * @return */ public static <T> T getBean(Class<T> cls) { if (!BEAN_MAP.containsKey(cls)) { throw new RuntimeException("Can not get bean by class:" + cls); } return (T)BEAN_MAP.get(cls); } }
package com.guanjian.util; import com.guanjian.annotion.Autowired; import com.guanjian.annotion.PostConstruct; import com.guanjian.utils.ArrayUtil; import com.guanjian.utils.CollectionUtil; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Map; /** * Created by Administrator on 2018-06-11. */ public final class IocHelper { public static void ioc(){ //獲取全部的Bean類與Bean實例之間的映射關係 Map<Class<?>,Object> beanMap = BeanHelper.getBeanMap(); if (CollectionUtil.isNotEmpty(beanMap)) { //遍歷Bean Map for (Map.Entry<Class<?>,Object> beanEntry:beanMap.entrySet()) { //從BeanMap中獲取Bean類與Bean實例 Class<?> beanClass = beanEntry.getKey(); Object beanInstance = beanEntry.getValue(); //獲取Bean類定義的全部成員變量 Field[] beanFields = beanClass.getDeclaredFields(); if (ArrayUtil.isNotEmpty(beanFields)) { //遍歷Bean Field for (Field beanField:beanFields) { //判斷當前Bean Field是否帶有Autowired註解 if (beanField.isAnnotationPresent(Autowired.class)) { //在Bean Map中獲取Bean Field對應的實例 Class<?> beanFieldClass = beanField.getType(); Object beanFieldInstance = beanMap.get(beanFieldClass); if (beanFieldInstance != null) { //經過反射初始化BeanField的值 ReflectionUtil.setField(beanInstance,beanField,beanFieldInstance); } } } } Method[] beanMethods = beanClass.getMethods(); if (ArrayUtil.isNotEmpty(beanMethods)) { //遍歷method for (Method method:beanMethods) { //判斷當前註解是否有PostConstruct註解 if (method.isAnnotationPresent(PostConstruct.class)) { try { //執行該方法 method.invoke(beanInstance,null); } catch (Exception e) { e.printStackTrace(); } } } } } } } }
package com.guanjian.manage; import com.guanjian.util.BeanHelper; import com.guanjian.util.ClassHelper; import com.guanjian.util.IocHelper; /** * Created by Administrator on 2018-06-11. */ public class Manager { public static Object getBean(Class<?> beanClass) { return BeanHelper.getBean(beanClass); } public static void scanAndImp(String basePackage) { ClassHelper.setClassSet(basePackage); BeanHelper.setBeanMap(); IocHelper.ioc(); } }
測試代碼工具
package com.guanjian.test.compent; import com.guanjian.annotion.Component; import com.guanjian.annotion.PostConstruct; /** * Created by Administrator on 2018-06-11. */ @Component public class Test1 { private String hello; @PostConstruct public void init() { hello = "你好"; } public void show() { System.out.println(hello); } }
package com.guanjian.test.compent; import com.guanjian.annotion.Autowired; import com.guanjian.annotion.Component; /** * Created by Administrator on 2018-06-11. */ @Component public class Test2 { @Autowired private Test1 test1; public void show() { test1.show(); } }
package com.guanjian.test; import com.guanjian.manage.Manager; import com.guanjian.test.compent.Test2; /** * Created by Administrator on 2018-06-11. */ public class Test { public static void main(String[] args) { Manager.scanAndImp("com.guanjian.test"); Test2 test2 = (Test2)Manager.getBean(Test2.class); test2.show(); } }