commit
						3fb93080b1
					
				| @ -0,0 +1,234 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
 | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  *      http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | package com.arialyy.aria.core; | ||||||
|  | 
 | ||||||
|  | import android.text.TextUtils; | ||||||
|  | import android.util.Log; | ||||||
|  | import org.xml.sax.Attributes; | ||||||
|  | import org.xml.sax.SAXException; | ||||||
|  | import org.xml.sax.helpers.DefaultHandler; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Created by Aria.Lao on 2017/5/22. | ||||||
|  |  * 读取配置文件 | ||||||
|  |  */ | ||||||
|  | public class ConfigHelper extends DefaultHandler { | ||||||
|  |   private final String TAG = "ConfigHelper"; | ||||||
|  | 
 | ||||||
|  |   private boolean isDownloadConfig = false, isUploadConfig; | ||||||
|  |   private Configuration.DownloadConfig mDownloadConfig = Configuration.DownloadConfig.getInstance(); | ||||||
|  |   private Configuration.UploadConfig mUploadConfig = Configuration.UploadConfig.getInstance(); | ||||||
|  | 
 | ||||||
|  |   @Override public void startDocument() throws SAXException { | ||||||
|  |     super.startDocument(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @Override | ||||||
|  |   public void startElement(String uri, String localName, String qName, Attributes attributes) | ||||||
|  |       throws SAXException { | ||||||
|  |     super.startElement(uri, localName, qName, attributes); | ||||||
|  |     if (qName.equals("download")) { | ||||||
|  |       isDownloadConfig = true; | ||||||
|  |       isUploadConfig = false; | ||||||
|  |     } else if (qName.equals("upload")) { | ||||||
|  |       isUploadConfig = true; | ||||||
|  |       isDownloadConfig = false; | ||||||
|  |     } | ||||||
|  |     if (isDownloadConfig || isUploadConfig) { | ||||||
|  | 
 | ||||||
|  |       String value = attributes.getValue("value"); | ||||||
|  |       switch (qName) { | ||||||
|  |         case "threadNum": | ||||||
|  |           loadThreadNum(value); | ||||||
|  |           break; | ||||||
|  |         case "openBroadcast": | ||||||
|  |           loadBroadcast(value); | ||||||
|  |           break; | ||||||
|  |         case "maxTaskNum": | ||||||
|  |           loadMaxQueue(value); | ||||||
|  |           break; | ||||||
|  |         case "reTryNum": | ||||||
|  |           loadReTry(value); | ||||||
|  |           break; | ||||||
|  |         case "connectTimeOut": | ||||||
|  |           loadConnectTime(value); | ||||||
|  |           break; | ||||||
|  |         case "iOTimeOut": | ||||||
|  |           loadIOTimeout(value); | ||||||
|  |           break; | ||||||
|  |         case "reTryInterval": | ||||||
|  |           loadReTryInterval(value); | ||||||
|  |           break; | ||||||
|  |         case "buffSize": | ||||||
|  |           loadBuffSize(value); | ||||||
|  |           break; | ||||||
|  |         case "ca": | ||||||
|  |           String caName = attributes.getValue("name"); | ||||||
|  |           String caPath = attributes.getValue("path"); | ||||||
|  |           loadCA(caName, caPath); | ||||||
|  |           break; | ||||||
|  |         case "convertSpeed": | ||||||
|  |           loadConvertSpeed(value); | ||||||
|  |           break; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private void loadConvertSpeed(String value) { | ||||||
|  |     boolean open = Boolean.parseBoolean(value); | ||||||
|  |     if (isDownloadConfig) { | ||||||
|  |       mDownloadConfig.isConvertSpeed = open; | ||||||
|  |     } | ||||||
|  |     if (isUploadConfig) { | ||||||
|  |       mUploadConfig.isConvertSpeed = open; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private void loadReTryInterval(String value) { | ||||||
|  |     int time = 2 * 1000; | ||||||
|  |     if (!TextUtils.isEmpty(value)) { | ||||||
|  |       time = Integer.parseInt(value); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (time < 2 * 1000) { | ||||||
|  |       time = 2 * 1000; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (isDownloadConfig) { | ||||||
|  |       mDownloadConfig.reTryInterval = time; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private void loadCA(String name, String path) { | ||||||
|  |     if (isDownloadConfig) { | ||||||
|  |       mDownloadConfig.caName = name; | ||||||
|  |       mDownloadConfig.caPath = path; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private void loadBuffSize(String value) { | ||||||
|  |     int buffSize = 8192; | ||||||
|  |     if (!TextUtils.isEmpty(value)) { | ||||||
|  |       buffSize = Integer.parseInt(value); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (buffSize < 2048) { | ||||||
|  |       buffSize = 2048; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (isDownloadConfig) { | ||||||
|  |       mDownloadConfig.buffSize = buffSize; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private void loadIOTimeout(String value) { | ||||||
|  |     int time = 10 * 1000; | ||||||
|  |     if (!TextUtils.isEmpty(value)) { | ||||||
|  |       time = Integer.parseInt(value); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (time < 10 * 1000) { | ||||||
|  |       time = 10 * 1000; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (isDownloadConfig) { | ||||||
|  |       mDownloadConfig.iOTimeOut = time; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private void loadConnectTime(String value) { | ||||||
|  |     int time = 5 * 1000; | ||||||
|  |     if (!TextUtils.isEmpty(value)) { | ||||||
|  |       time = Integer.parseInt(value); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (isDownloadConfig) { | ||||||
|  |       mDownloadConfig.connectTimeOut = time; | ||||||
|  |     } | ||||||
|  |     if (isUploadConfig) { | ||||||
|  |       mUploadConfig.connectTimeOut = time; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private void loadReTry(String value) { | ||||||
|  |     int num = 0; | ||||||
|  |     if (!TextUtils.isEmpty(value)) { | ||||||
|  |       num = Integer.parseInt(value); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (isDownloadConfig) { | ||||||
|  |       mDownloadConfig.reTryNum = num; | ||||||
|  |     } | ||||||
|  |     if (isUploadConfig) { | ||||||
|  |       mUploadConfig.reTryNum = num; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private void loadMaxQueue(String value) { | ||||||
|  |     int num = 2; | ||||||
|  |     if (!TextUtils.isEmpty(value)) { | ||||||
|  |       num = Integer.parseInt(value); | ||||||
|  |     } | ||||||
|  |     if (num < 1) { | ||||||
|  |       Log.e(TAG, "任务队列数不能小于 1"); | ||||||
|  |       num = 2; | ||||||
|  |     } | ||||||
|  |     if (isDownloadConfig) { | ||||||
|  |       mDownloadConfig.maxTaskNum = num; | ||||||
|  |     } | ||||||
|  |     if (isUploadConfig) { | ||||||
|  |       mUploadConfig.maxTaskNum = num; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private void loadBroadcast(String value) { | ||||||
|  |     boolean open = Boolean.parseBoolean(value); | ||||||
|  |     if (isDownloadConfig) { | ||||||
|  |       mDownloadConfig.isOpenBreadCast = open; | ||||||
|  |     } | ||||||
|  |     if (isUploadConfig) { | ||||||
|  |       mUploadConfig.isOpenBreadCast = open; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private void loadThreadNum(String value) { | ||||||
|  |     int num = 3; | ||||||
|  |     if (!TextUtils.isEmpty(value)) { | ||||||
|  |       num = Integer.parseInt(value); | ||||||
|  |     } | ||||||
|  |     if (num < 1) { | ||||||
|  |       Log.e(TAG, "下载线程数不能小于 1"); | ||||||
|  |       num = 3; | ||||||
|  |     } | ||||||
|  |     if (isDownloadConfig) { | ||||||
|  |       mDownloadConfig.threadNum = num; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @Override public void characters(char[] ch, int start, int length) throws SAXException { | ||||||
|  |     super.characters(ch, start, length); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @Override public void endElement(String uri, String localName, String qName) throws SAXException { | ||||||
|  |     super.endElement(uri, localName, qName); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @Override public void endDocument() throws SAXException { | ||||||
|  |     super.endDocument(); | ||||||
|  |     mDownloadConfig.saveAll(); | ||||||
|  |     mUploadConfig.saveAll(); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -1,228 +0,0 @@ | |||||||
| /* |  | ||||||
|  * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
 |  | ||||||
|  * |  | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  | ||||||
|  * you may not use this file except in compliance with the License. |  | ||||||
|  * You may obtain a copy of the License at |  | ||||||
|  * |  | ||||||
|  *      http://www.apache.org/licenses/LICENSE-2.0
 |  | ||||||
|  * |  | ||||||
|  * Unless required by applicable law or agreed to in writing, software |  | ||||||
|  * distributed under the License is distributed on an "AS IS" BASIS, |  | ||||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |  | ||||||
|  * See the License for the specific language governing permissions and |  | ||||||
|  * limitations under the License. |  | ||||||
|  */ |  | ||||||
| package com.arialyy.aria.util; |  | ||||||
| 
 |  | ||||||
| import android.util.Log; |  | ||||||
| import com.arialyy.aria.core.AriaManager; |  | ||||||
| import java.io.File; |  | ||||||
| import java.io.IOException; |  | ||||||
| import java.util.Map; |  | ||||||
| import java.util.Properties; |  | ||||||
| import java.util.Set; |  | ||||||
| import java.util.WeakHashMap; |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * Created by AriaL on 2016/12/8. |  | ||||||
|  * 信息配置 |  | ||||||
|  */ |  | ||||||
| public class Configuration_1 { |  | ||||||
|   private static final String TAG = "Configuration_1"; |  | ||||||
|   private static final String CONFIG_FILE = "/Aria/ADConfig.properties"; |  | ||||||
|   /** |  | ||||||
|    * 当前调度器最大下载数,默认最大下载数为 “2” |  | ||||||
|    */ |  | ||||||
|   private static final String DOWNLOAD_NUM = "DOWNLOAD_NUM"; |  | ||||||
|   /** |  | ||||||
|    * 失败重试次数,默认最多重试 10 次 |  | ||||||
|    */ |  | ||||||
|   private static final String RE_TRY_NUM = "RE_TRY_NUM"; |  | ||||||
|   /** |  | ||||||
|    * 是否打开下载广播,默认 false |  | ||||||
|    */ |  | ||||||
|   private static final String OPEN_BROADCAST = "OPEN_BROADCAST"; |  | ||||||
|   /** |  | ||||||
|    * 失败重试间隔时间,默认 4000 ms |  | ||||||
|    */ |  | ||||||
|   private static final String RE_TRY_INTERVAL = "RE_TRY_INTERVAL"; |  | ||||||
|   /** |  | ||||||
|    * 超时时间,默认 10000 ms |  | ||||||
|    */ |  | ||||||
|   private static final String DOWNLOAD_TIME_OUT = "DOWNLOAD_TIME_OUT"; |  | ||||||
|   /** |  | ||||||
|    * 设置最大速度 |  | ||||||
|    */ |  | ||||||
|   private static final String MAX_SPEED = "MAX_SPEED"; |  | ||||||
| 
 |  | ||||||
|   public static boolean isOpenBreadCast = false; |  | ||||||
| 
 |  | ||||||
|   private static Configuration_1 INSTANCE = null; |  | ||||||
|   private File mConfigFile = null; |  | ||||||
|   private static final Object LOCK = new Object(); |  | ||||||
| 
 |  | ||||||
|   public static Configuration_1 getInstance() { |  | ||||||
|     if (INSTANCE == null) { |  | ||||||
|       synchronized (LOCK) { |  | ||||||
|         INSTANCE = new Configuration_1(); |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|     return INSTANCE; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   private Configuration_1() { |  | ||||||
|     mConfigFile = new File(AriaManager.APP.getFilesDir().getPath() + CONFIG_FILE); |  | ||||||
|     try { |  | ||||||
|       if (!mConfigFile.exists()) { |  | ||||||
|         mConfigFile.getParentFile().mkdirs(); |  | ||||||
|         mConfigFile.createNewFile(); |  | ||||||
|         init(); |  | ||||||
|       } else { |  | ||||||
|         isOpenBreadCast = isOpenBroadcast(); |  | ||||||
|       } |  | ||||||
|     } catch (IOException e) { |  | ||||||
|       e.printStackTrace(); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   private void init() { |  | ||||||
|     Map<String, String> config = new WeakHashMap<>(); |  | ||||||
|     config.put(DOWNLOAD_NUM, 2 + ""); |  | ||||||
|     config.put(RE_TRY_NUM, 10 + ""); |  | ||||||
|     config.put(OPEN_BROADCAST, false + ""); |  | ||||||
|     config.put(RE_TRY_INTERVAL, 4000 + ""); |  | ||||||
|     config.put(DOWNLOAD_TIME_OUT, 10000 + ""); |  | ||||||
|     config.put(MAX_SPEED, 64 + ""); |  | ||||||
|     saveConfig(config); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   private void saveConfig(Map<String, String> config) { |  | ||||||
|     if (config == null || config.size() == 0) { |  | ||||||
|       return; |  | ||||||
|     } |  | ||||||
|     Properties properties = CommonUtil.loadConfig(mConfigFile); |  | ||||||
|     Set<String> keys = config.keySet(); |  | ||||||
|     for (String key : keys) { |  | ||||||
|       properties.setProperty(key, config.get(key)); |  | ||||||
|     } |  | ||||||
|     CommonUtil.saveConfig(mConfigFile, properties); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   private void save(String key, String value) { |  | ||||||
|     Map<String, String> map = new WeakHashMap<>(); |  | ||||||
|     map.put(key, value); |  | ||||||
|     saveConfig(map); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /** |  | ||||||
|    * 设置最大下载速度 |  | ||||||
|    */ |  | ||||||
|   public void setMaxSpeed(Speed speed) { |  | ||||||
|     save(MAX_SPEED, speed.buf + ""); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /** |  | ||||||
|    * 获取最大速度 |  | ||||||
|    */ |  | ||||||
|   public int getMaxSpeed() { |  | ||||||
|     return Integer.parseInt(CommonUtil.loadConfig(mConfigFile).getProperty(MAX_SPEED, "8192")); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /** |  | ||||||
|    * 获取下载超时时间 |  | ||||||
|    * |  | ||||||
|    * @return 默认4000ms |  | ||||||
|    */ |  | ||||||
|   public int getTimeOut() { |  | ||||||
|     return Integer.parseInt(CommonUtil.loadConfig(mConfigFile).getProperty(DOWNLOAD_TIME_OUT)); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /** |  | ||||||
|    * 设置重试间隔 |  | ||||||
|    */ |  | ||||||
|   public void setTimeOut(int timeOut) { |  | ||||||
|     if (timeOut < 10000) { |  | ||||||
|       Log.w(TAG, "下载超时时间不能小于 10000 ms"); |  | ||||||
|       return; |  | ||||||
|     } |  | ||||||
|     save(DOWNLOAD_TIME_OUT, timeOut + ""); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /** |  | ||||||
|    * 获取失败重试间隔时间 |  | ||||||
|    * |  | ||||||
|    * @return 默认4000ms |  | ||||||
|    */ |  | ||||||
|   public int getReTryInterval() { |  | ||||||
|     return Integer.parseInt(CommonUtil.loadConfig(mConfigFile).getProperty(RE_TRY_INTERVAL)); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /** |  | ||||||
|    * 设置重试间隔 |  | ||||||
|    */ |  | ||||||
|   public void setReTryInterval(int reTryInterval) { |  | ||||||
|     if (reTryInterval < 4000) { |  | ||||||
|       Log.w(TAG, "重试间隔不能小于4000ms"); |  | ||||||
|       return; |  | ||||||
|     } |  | ||||||
|     save(RE_TRY_INTERVAL, reTryInterval + ""); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /** |  | ||||||
|    * 获取最大下载数 |  | ||||||
|    * |  | ||||||
|    * @return 默认返回2 |  | ||||||
|    */ |  | ||||||
|   public int getDownloadNum() { |  | ||||||
|     return Integer.parseInt(CommonUtil.loadConfig(mConfigFile).getProperty(DOWNLOAD_NUM)); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /** |  | ||||||
|    * 设置最大下载数 |  | ||||||
|    */ |  | ||||||
|   public void setDownloadNum(int downloadNum) { |  | ||||||
|     if (downloadNum < 1) { |  | ||||||
|       Log.w(TAG, "最大下载数不能小于1"); |  | ||||||
|       return; |  | ||||||
|     } |  | ||||||
|     save(DOWNLOAD_NUM, downloadNum + ""); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /** |  | ||||||
|    * 获取最大重试数 |  | ||||||
|    * |  | ||||||
|    * @return 默认返回 10 |  | ||||||
|    */ |  | ||||||
|   public int getReTryNum() { |  | ||||||
|     return Integer.parseInt(CommonUtil.loadConfig(mConfigFile).getProperty(RE_TRY_NUM)); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /** |  | ||||||
|    * 设置重试数 |  | ||||||
|    */ |  | ||||||
|   public void setReTryNum(int reTryNum) { |  | ||||||
|     if (reTryNum < 1) { |  | ||||||
|       Log.w(TAG, "最大下载数不能小于1"); |  | ||||||
|       return; |  | ||||||
|     } |  | ||||||
|     save(RE_TRY_NUM, reTryNum + ""); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /** |  | ||||||
|    * 是否打开下载广播 |  | ||||||
|    * |  | ||||||
|    * @return 默认false |  | ||||||
|    */ |  | ||||||
|   public boolean isOpenBroadcast() { |  | ||||||
|     return Boolean.parseBoolean(CommonUtil.loadConfig(mConfigFile).getProperty(RE_TRY_NUM)); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /** |  | ||||||
|    * 设置是否打开下载广播 |  | ||||||
|    */ |  | ||||||
|   public void setOpenBroadcast(boolean openBroadcast) { |  | ||||||
|     isOpenBreadCast = openBroadcast; |  | ||||||
|     save(OPEN_BROADCAST, openBroadcast + ""); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| @ -0,0 +1,113 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
 | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  *      http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | package com.arialyy.aria.util; | ||||||
|  | 
 | ||||||
|  | import android.util.Log; | ||||||
|  | import java.lang.reflect.Field; | ||||||
|  | import java.lang.reflect.Method; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.Collections; | ||||||
|  | import java.util.List; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Created by “AriaLyy@outlook.com” on 2015/7/30. | ||||||
|  |  * 反射工具类 | ||||||
|  |  */ | ||||||
|  | public class ReflectionUtil { | ||||||
|  |   private static final String TAG = "ReflectionUtil"; | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * 获取类里面的所在字段 | ||||||
|  |    */ | ||||||
|  |   public static Field[] getFields(Class clazz) { | ||||||
|  |     Field[] fields = null; | ||||||
|  |     fields = clazz.getDeclaredFields(); | ||||||
|  |     if (fields == null || fields.length == 0) { | ||||||
|  |       Class superClazz = clazz.getSuperclass(); | ||||||
|  |       if (superClazz != null) { | ||||||
|  |         fields = getFields(superClazz); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     return fields; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * 获取所有字段,包括父类的字段 | ||||||
|  |    */ | ||||||
|  |   public static List<Field> getAllFields(Class clazz) { | ||||||
|  |     List<Field> fields = new ArrayList<>(); | ||||||
|  |     Class personClazz = clazz.getSuperclass(); | ||||||
|  |     if (personClazz != null) { | ||||||
|  |       Collections.addAll(fields, personClazz.getDeclaredFields()); | ||||||
|  |     } | ||||||
|  |     Collections.addAll(fields, clazz.getDeclaredFields()); | ||||||
|  |     return fields; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * 获取类里面的指定对象,如果该类没有则从父类查询 | ||||||
|  |    */ | ||||||
|  |   public static Field getField(Class clazz, String name) { | ||||||
|  |     Field field = null; | ||||||
|  |     try { | ||||||
|  |       field = clazz.getDeclaredField(name); | ||||||
|  |     } catch (NoSuchFieldException e) { | ||||||
|  |       try { | ||||||
|  |         field = clazz.getField(name); | ||||||
|  |       } catch (NoSuchFieldException e1) { | ||||||
|  |         if (clazz.getSuperclass() == null) { | ||||||
|  |           return field; | ||||||
|  |         } else { | ||||||
|  |           field = getField(clazz.getSuperclass(), name); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if (field != null) { | ||||||
|  |       field.setAccessible(true); | ||||||
|  |     } | ||||||
|  |     return field; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * 利用递归找一个类的指定方法,如果找不到,去父亲里面找直到最上层Object对象为止。 | ||||||
|  |    * | ||||||
|  |    * @param clazz 目标类 | ||||||
|  |    * @param methodName 方法名 | ||||||
|  |    * @param params 方法参数类型数组 | ||||||
|  |    * @return 方法对象 | ||||||
|  |    */ | ||||||
|  |   public static Method getMethod(Class clazz, String methodName, final Class<?>... params) { | ||||||
|  |     Method method = null; | ||||||
|  |     try { | ||||||
|  |       method = clazz.getDeclaredMethod(methodName, params); | ||||||
|  |     } catch (NoSuchMethodException e) { | ||||||
|  |       try { | ||||||
|  |         method = clazz.getMethod(methodName, params); | ||||||
|  |       } catch (NoSuchMethodException ex) { | ||||||
|  |         if (clazz.getSuperclass() == null) { | ||||||
|  |           Log.e(TAG, "无法找到" + methodName + "方法"); | ||||||
|  |           return method; | ||||||
|  |         } else { | ||||||
|  |           method = getMethod(clazz.getSuperclass(), methodName, params); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if (method != null) { | ||||||
|  |       method.setAccessible(true); | ||||||
|  |     } | ||||||
|  |     return method; | ||||||
|  |   } | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in new issue