java反射 实际使用 约定不等于承诺〃 2022-02-21 12:51 193阅读 0赞 ### 实例化和负值 ### private void run() { String path = "com.gray.game.grayreflect.ReflectModel"; try { //获取对象实例 ReflectModel model = (ReflectModel) Class.forName(path).newInstance(); if (model != null) { System.out.println("实例化ReflectModel成功!"); //开始设置值 Field field = model.getClass().getField("color"); String vobj = "大豆"; Object object = parseValue(field.getType(), vobj); field.set(model, object); } } catch (Exception e) { log.debug("实例化失败", path); } } /** * 找到对应的类型 * * @param fieldClazz * @param value * @return */ public static Object parseValue(Type fieldClazz, String value) { if (fieldClazz == String.class) { return value; } else if (fieldClazz == int.class || fieldClazz == Integer.class) { return Double.valueOf(value).intValue(); } else if (fieldClazz == byte.class || fieldClazz == Byte.class) { return Double.valueOf(value).byteValue(); } else if (fieldClazz == boolean.class || fieldClazz == Boolean.class) { if (value == null || value.isEmpty() || "false".equalsIgnoreCase(value) || "0.0".equals(value) || "0".equals(value)) { return false; } else { return true; } } else if (fieldClazz == short.class || fieldClazz == Short.class) { return Double.valueOf(value).shortValue(); } else if (fieldClazz == long.class || fieldClazz == Long.class) { return Double.valueOf(value).longValue(); } else if (fieldClazz == float.class || fieldClazz == Float.class) { return Float.valueOf(value); } else if (fieldClazz == double.class || fieldClazz == Double.class) { return Double.valueOf(value); } return value; } ## **禁止使用反射机制初始化** ## 将构造函数为私有化 //获取类信息 Class<?> c1 = Class.forName("ReflectModel"); Class<?> c2 = ReflectModel.class; //实例化 Object newInstance = c2.newInstance(); <table style="width:426.1pt;"> <tbody> <tr> <td style="vertical-align:top;width:213.05pt;"> <p style="margin-left:0pt;">getDeclaredMethods []</p> </td> <td style="vertical-align:top;width:213.05pt;"> <p style="margin-left:0pt;">获取该类的所有方法</p> </td> </tr> <tr> <td style="vertical-align:top;width:213.05pt;"> <p style="margin-left:0pt;">getReturnType()</p> </td> <td style="vertical-align:top;width:213.05pt;"> <p style="margin-left:0pt;">获取该类的返回值</p> </td> </tr> <tr> <td style="vertical-align:top;width:213.05pt;"> <p style="margin-left:0pt;">getParameterTypes()</p> </td> <td style="vertical-align:top;width:213.05pt;"> <p style="margin-left:0pt;">获取传入参数</p> </td> </tr> <tr> <td style="vertical-align:top;width:213.05pt;"> <p style="margin-left:0pt;">getDeclaredFields()</p> </td> <td style="vertical-align:top;width:213.05pt;"> <p style="margin-left:0pt;">获取该类的所有字段</p> </td> </tr> <tr> <td style="vertical-align:top;width:213.05pt;"> <p style="margin-left:0pt;">setAccessible</p> </td> <td style="vertical-align:top;width:213.05pt;"> <p style="margin-left:0pt;">允许访问私有成员</p> </td> </tr> </tbody> </table> 反射工具类 public class ClassUtil { /** * 取得某个接口下所有实现这个接口的类 */ public static List<Class> getAllClassByInterface(Class c) { List<Class> returnClassList = null; if (c.isInterface()) { // 获取当前的包名 String packageName = c.getPackage().getName(); // 获取当前包下以及子包下所以的类 List<Class<?>> allClass = getClasses(packageName); if (allClass != null) { returnClassList = new ArrayList<Class>(); for (Class classes : allClass) { // 判断是否是同一个接口 if (c.isAssignableFrom(classes)) { // 本身不加入进去 if (!c.equals(classes)) { returnClassList.add(classes); } } } } } return returnClassList; } /* * 取得某一类所在包的所有类名 不含迭代 */ public static String[] getPackageAllClassName(String classLocation, String packageName) { // 将packageName分解 String[] packagePathSplit = packageName.split("[.]"); String realClassLocation = classLocation; int packageLength = packagePathSplit.length; for (int i = 0; i < packageLength; i++) { realClassLocation = realClassLocation + File.separator + packagePathSplit[i]; } File packeageDir = new File(realClassLocation); if (packeageDir.isDirectory()) { String[] allClassName = packeageDir.list(); return allClassName; } return null; } /** * 从包package中获取所有的Class * * @return */ public static List<Class<?>> getClasses(String packageName) { // 第一个class类的集合 List<Class<?>> classes = new ArrayList<Class<?>>(); // 是否循环迭代 boolean recursive = true; // 获取包的名字 并进行替换 String packageDirName = packageName.replace('.', '/'); // 定义一个枚举的集合 并进行循环来处理这个目录下的things Enumeration<URL> dirs; try { dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName); // 循环迭代下去 while (dirs.hasMoreElements()) { // 获取下一个元素 URL url = dirs.nextElement(); // 得到协议的名称 String protocol = url.getProtocol(); // 如果是以文件的形式保存在服务器上 if ("file".equals(protocol)) { // 获取包的物理路径 String filePath = URLDecoder.decode(url.getFile(), "UTF-8"); // 以文件的方式扫描整个包下的文件 并添加到集合中 findAndAddClassesInPackageByFile(packageName, filePath, recursive, classes); } else if ("jar".equals(protocol)) { // 如果是jar包文件 // 定义一个JarFile JarFile jar; try { // 获取jar jar = ((JarURLConnection) url.openConnection()).getJarFile(); // 从此jar包 得到一个枚举类 Enumeration<JarEntry> entries = jar.entries(); // 同样的进行循环迭代 while (entries.hasMoreElements()) { // 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件 JarEntry entry = entries.nextElement(); String name = entry.getName(); // 如果是以/开头的 if (name.charAt(0) == '/') { // 获取后面的字符串 name = name.substring(1); } // 如果前半部分和定义的包名相同 if (name.startsWith(packageDirName)) { int idx = name.lastIndexOf('/'); // 如果以"/"结尾 是一个包 if (idx != -1) { // 获取包名 把"/"替换成"." packageName = name.substring(0, idx).replace('/', '.'); } // 如果可以迭代下去 并且是一个包 if ((idx != -1) || recursive) { // 如果是一个.class文件 而且不是目录 if (name.endsWith(".class") && !entry.isDirectory()) { // 去掉后面的".class" 获取真正的类名 String className = name.substring(packageName.length() + 1, name.length() - 6); try { // 添加到classes classes.add(Class.forName(packageName + '.' + className)); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } } } } catch (IOException e) { e.printStackTrace(); } } } } catch (IOException e) { e.printStackTrace(); } return classes; } /** * 以文件的形式来获取包下的所有Class * * @param packageName * @param packagePath * @param recursive * @param classes */ public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive, List<Class<?>> classes) { // 获取此包的目录 建立一个File File dir = new File(packagePath); // 如果不存在或者 也不是目录就直接返回 if (!dir.exists() || !dir.isDirectory()) { return; } // 如果存在 就获取包下的所有文件 包括目录 File[] dirfiles = dir.listFiles(new FileFilter() { // 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件) public boolean accept(File file) { return (recursive && file.isDirectory()) || (file.getName().endsWith(".class")); } }); // 循环所有文件 for (File file : dirfiles) { // 如果是目录 则继续扫描 if (file.isDirectory()) { findAndAddClassesInPackageByFile(packageName + "." + file.getName(), file.getAbsolutePath(), recursive, classes); } else { // 如果是java类文件 去掉后面的.class 只留下类名 String className = file.getName().substring(0, file.getName().length() - 6); try { // 添加到集合中去 classes.add(Class.forName(packageName + '.' + className)); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } } // 首字母转小写 public static String toLowerCaseFirstOne(String s) { if (Character.isLowerCase(s.charAt(0))) return s; else return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString(); } // 初始化对象 public static Object newInstance(Class<?> classInfo) throws ClassNotFoundException, InstantiationException, IllegalAccessException { return classInfo.newInstance(); } }
相关 Java反射机制在实际项目中的问题示例 在实际项目中,Java反射机制可能会带来一些问题。以下是一些示例: 1. **安全性问题**:反射可以访问任何类的私有信息,如果这些信息被恶意使用,可能导致数据泄露或安全漏洞 爱被打了一巴掌/ 2024年09月16日 06:03/ 0 赞/ 14 阅读
相关 Java中反射API的实际运用示例 在Java中,反射API允许我们动态地访问和操作对象的属性和方法。以下是一个实际运用示例: ```java import java.lang.reflect.Method; 绝地灬酷狼/ 2024年09月14日 23:57/ 0 赞/ 16 阅读
相关 Java反射API的理解与实际使用案例 Java的反射API(Reflection API)是一种强大的工具,它允许你在运行时检查类、方法、属性等信息,并动态调用它们。 理解与应用: 1. **获取类信息**: 淡淡的烟草味﹌/ 2024年09月12日 04:15/ 0 赞/ 27 阅读
相关 Java反射API在实际开发中的常见问题 Java反射API在实际开发中可能会遇到以下一些常见的问题: 1. 性能问题:反射操作通常比直接调用方法或访问字段慢,尤其是频繁或者复杂的反射。 2. 法律合规问题:滥用反 叁歲伎倆/ 2024年09月11日 11:21/ 0 赞/ 20 阅读
相关 Java反射API在实际开发中的常见问题 Java反射API,即Java的动态代码生成机制,常用于获取类的信息、创建对象、调用方法等。但在实际开发中,可能会遇到以下一些问题: 1. 性能问题:反射会导致额外的字节序列 电玩女神/ 2024年09月11日 00:18/ 0 赞/ 23 阅读
相关 Java反射机制--遍历所有属性的实际应用 一、背景 > 在开发项目时,遇到数据表字段较多,逐一去使用getter获取值感觉有点低效,于是思考能不能像数组一样去遍历这些属性。于是就想到了Java的反射机制。那么我们就以 太过爱你忘了你带给我的痛/ 2022年11月18日 10:53/ 0 赞/ 184 阅读
相关 java lambda 实际使用总结 1、获取列表中的某一列形成新的列表。 List<ProjectWithEpic> projectWithEpics = (List<ProjectWithEpic>) 墨蓝/ 2022年05月08日 07:58/ 0 赞/ 132 阅读
相关 java反射 实际使用 实例化和负值 private void run() { String path = "com.gray.game.grayreflect 约定不等于承诺〃/ 2022年02月21日 12:51/ 0 赞/ 194 阅读
还没有评论,来说两句吧...