Java--反射--使用/应用/教程/实例 灰太狼 2022-08-28 03:55 178阅读 0赞 原文网址:[Java--反射--使用/应用/教程/实例\_IT利刃出鞘的博客-CSDN博客][Java--_--_IT_-CSDN] # 简介 # 本文用示例介绍Java反射的常用方法、反射实例化对象、取得类结构、应用。 # Class常用方法 # <table> <tbody> <tr> <td> <p><strong><strong>方法</strong></strong></p> </td> <td> <p><strong><strong>说明</strong></strong></p> </td> </tr> <tr> <td> <p>getName()</p> </td> <td> <p>返回String形式的该类的名称。</p> </td> </tr> <tr> <td> <p>newInstance()</p> </td> <td> <p>根据某个Class对象产生其对应类的实例,它调用的是此类的默认构造方法(没有默认无参构造器会报错)</p> </td> </tr> <tr> <td> <p>getClassLoader()</p> </td> <td> <p>返回该Class对象对应的类的类加载器。</p> </td> </tr> <tr> <td> <p>getSuperClass()</p> </td> <td> <p>返回某子类所对应的直接父类所对应的Class对象</p> </td> </tr> <tr> <td> <p>getComponentType()</p> </td> <td> <p>如果当前类表示一个数组,则返回表示该数组组件的 Class 对象,否则返回 null。</p> </td> </tr> <tr> <td> <p>getConstructor(Class[])</p> </td> <td> <p>返回当前 Class 对象表示的类的指定的公有构造子对象。</p> </td> </tr> <tr> <td> <p>getConstructors()</p> </td> <td> <p>返回当前 Class 对象表示的类的所有公有构造子对象数组。</p> </td> </tr> <tr> <td> <p>getDeclaredConstructor(Class[])</p> </td> <td> <p>返回当前 Class 对象表示的类的指定已说明的一个构造子对象。</p> </td> </tr> <tr> <td> <p>getDeclaredConstructors()</p> </td> <td> <p>返回当前 Class 对象表示的类的所有已说明的构造子对象数组。</p> </td> </tr> <tr> <td> <p>getDeclaredField(String)</p> </td> <td> <p>返回当前 Class 对象表示的类或接口的指定已说明的一个域对象。</p> </td> </tr> <tr> <td> <p>getDeclaredFields()</p> </td> <td> <p>返回当前 Class 对象表示的类或接口的所有已说明的域对象数组。</p> </td> </tr> <tr> <td> <p>getDeclaredMethod(String, Class[])</p> </td> <td> <p>返回当前 Class 对象表示的类或接口的指定已说明的一个方法对象。</p> </td> </tr> <tr> <td> <p>getDeclaredMethods()</p> </td> <td> <p>返回 Class 对象表示的类或接口的所有已说明的方法数组。</p> </td> </tr> <tr> <td> <p>getField(String)</p> </td> <td> <p>返回当前 Class 对象表示的类或接口的指定的公有成员域对象。</p> </td> </tr> <tr> <td> <p>getFields()</p> </td> <td> <p>返回当前 Class 对象表示的类或接口的所有可访问的公有域对象数组。</p> </td> </tr> <tr> <td> <p>getInterfaces()</p> </td> <td> <p>返回当前对象表示的类或接口实现的接口。</p> </td> </tr> <tr> <td> <p>getMethod(String, Class[])</p> </td> <td> <p>返回当前 Class 对象表示的类或接口的指定的公有成员方法对象。</p> </td> </tr> <tr> <td> <p>getMethods()</p> </td> <td> <p>返回当前 Class 对象表示的类或接口的所有公有成员方法对象数组,包括已声明的和从父类继承的方法。</p> </td> </tr> <tr> <td> <p>isArray()</p> </td> <td> <p>判定此Class对象所对应的是否是一个数组对象</p> </td> </tr> <tr> <td> <p>isInstance(Object)</p> </td> <td> <p>此方法是 Java 语言 instanceof 操作的动态等价方法。</p> </td> </tr> <tr> <td> <p>isInterface()</p> </td> <td> <p>判定指定的 Class 对象是否表示一个接口类型</p> </td> </tr> <tr> <td> <p>isPrimitive()</p> </td> <td> <p>判定指定的 Class 对象是否表示一个 Java 的基类型。</p> </td> </tr> </tbody> </table> # 构造实例化对象 # ## Class.forName和ClassLoader ## <table> <tbody> <tr> <td> <p><strong><strong>项</strong></strong></p> </td> <td> <p><strong><strong>Class.forName</strong></strong></p> </td> <td> <p><strong><strong>ClassLoader</strong></strong></p> </td> </tr> <tr> <td> <p><strong><strong>关系</strong></strong></p> </td> <td colspan="2"> <p>Class.forName()方法也是调用的 ClassLoader 来实现的。</p> </td> </tr> <tr> <td> <p><strong><strong>灵活度</strong></strong></p> </td> <td> <p>灵活度低。</p> <p>例如:加载的类只能是classpath下的</p> </td> <td> <p>灵活度高。</p> <p>例如:可以自己编写加载类的方法:比如通过读取类文件的二进制数据,这个时候文件可以不存在ClassPath中。</p> </td> </tr> <tr> <td> <p><strong><strong>是否进行初始化</strong></strong></p> </td> <td> <p>是。</p> <p>forName方法最后调用 forName0(本地方法),第二个参数被设置为了 true,代表对加载的类进行初始化(执行类中的静态代码块,以及对静态变量的赋值等操作)</p> </td> <td> <p>否。</p> </td> </tr> </tbody> </table> **forName** @CallerSensitive public static Class<?> forName(String className) throws ClassNotFoundException { Class<?> caller = Reflection.getCallerClass(); return forName0(className, true, ClassLoader.getClassLoader(caller), caller); } 它有个重载(可以手动选择在加载类时是否要对其类进行初始化。) public static Class<?> forName(String name, boolean initialize, ClassLoader loader){} **实例(forName)** package org.example.a; class Test { static { System.out.println("静态代码块"); } public static final String title = getTitle(); private static String getTitle(){ System.out.println("执行getTitle()"); return "TITLE"; } } public class Demo { public static void main(String[] args) { Class<?> c = null; try { c = Class.forName("org.example.a.Test"); }catch (Exception e){ e.printStackTrace(); } Test test = null; try { test = (Test) c.newInstance(); } catch (Exception e) { e.printStackTrace(); } } } 执行结果 静态代码块 执行getTitle() **实例(ClassLoader)** package org.example.a; class Test { static { System.out.println("静态代码块"); } public static final String title = getTitle(); private static String getTitle(){ System.out.println("执行getTitle()"); return "TITLE"; } } public class Demo { public static void main(String[] args) { Class<?> c = null; try { c = ClassLoader.getSystemClassLoader().loadClass("org.example.a.Test"); }catch (Exception e){ e.printStackTrace(); } Test test = null; try { test = (Test) c.newInstance(); } catch (Exception e) { e.printStackTrace(); } } } 执行结果 无任何输出。 **JDBC为什么用Class.forName** JDBC 规范中明确要求 Driver(数据库驱动)类必须向 DriverManager 注册。 以 MySQL 的驱动为例,我们看到 Driver 注册到 DriverManager 中的操作写在了静态代码块中,这就是为什么在写 JDBC 时使用 Class.forName() 的原因了。 public class Driver extends NonRegisteringDriver implements java.sql.Driver { // // Register ourselves with the DriverManager // static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } /** * Construct a new driver and register it with DriverManager * * @throws SQLException * if a database error occurs. */ public Driver() throws SQLException { // Required for Class.forName().newInstance() } } ## 无参与有参构造 ## 前边示例是无参构造,也可以有参构造: package org.example.a; import java.lang.reflect.Constructor; class Test { String name; public Test(String name) { this.name = name; } static { System.out.println("静态代码块"); } public static final String title = getTitle(); private static String getTitle(){ System.out.println("执行getTitle()"); return "TITLE"; } } public class Demo { public static void main(String[] args) { Class<?> c = null; try { c = Class.forName("org.example.a.Test"); }catch (Exception e){ e.printStackTrace(); } Constructor<?> cons[] = c.getConstructors(); Test test = null; try { test = (Test) cons[0].newInstance("Tony"); } catch (Exception e) { e.printStackTrace(); } } } 执行结果 静态代码块 执行getTitle() # 取得类结构 # ## 取得接口/父类/构造方法 ## <table> <tbody> <tr> <td><strong>方法</strong></td> <td><strong>说明</strong></td> </tr> <tr> <td>Class<?>[] c1 = c.getInterfaces();</td> <td>取得实现的接口</td> </tr> <tr> <td>Class<?> c2 = c.getSuperclass();</td> <td>取得父类</td> </tr> <tr> <td>Constructor<?> con[] = c.getConstructors();</td> <td>取得构造函数</td> </tr> </tbody> </table> ## 取得方法 ## <table> <tbody> <tr> <td> <p><strong><strong>方法</strong></strong></p> </td> <td> <p><strong><strong>说明</strong></strong></p> </td> </tr> <tr> <td> <p>Method getMethod(String name, Class<?>... parameterTypes)</p> </td> <td> <p>通过方法名和参数列表获得方法</p> </td> </tr> <tr> <td> <p>Method[] getMethods()</p> </td> <td> <p>获得所有方法。</p> <p>反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共(public) member 方法。</p> </td> </tr> <tr> <td> <p>Method getDeclaredMethod(String name, Class<?>... parameterTypes)</p> </td> <td> <p></p> </td> </tr> <tr> <td> <p>Method[] getDeclaredMethods()</p> </td> <td> <p>反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 </p> </td> </tr> </tbody> </table> **详细方法** <table> <tbody> <tr> <td> <p><strong><strong>方法</strong></strong></p> </td> <td> <p><strong><strong>说明</strong></strong></p> </td> </tr> <tr> <td> <p>int getModifiers()</p> </td> <td> <p>取得本方法的访问修饰符。</p> <p>取得后通过Modefier.toString(xxx)还原</p> </td> </tr> <tr> <td> <p>String getName()</p> </td> <td> <p>取得方法的名称</p> </td> </tr> <tr> <td> <p>Class<?>[] getParameterTypes()</p> </td> <td> <p>得到方法的全部参数类型</p> </td> </tr> <tr> <td> <p>Class<?> getReturnType()</p> </td> <td> <p>得到方法的返回值类型</p> </td> </tr> <tr> <td> <p>CIass<?>[] getExceptionType()</p> </td> <td> <p>得到一个方法的全部抛出异常</p> </td> </tr> </tbody> </table> **实例** package org.example.a; import java.lang.reflect.Method; import java.lang.reflect.Modifier; interface ICategory { public static final String CATEGORY_NAME = "Human"; public void sayCategory(); public String sayHello(String name, Integer age); } class Human implements ICategory { private String name; private Integer age; public Human() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public void sayCategory() { System.out.println(CATEGORY_NAME); } @Override public String sayHello(String name, Integer age) { return "名字:" + name + "年龄:" + age; } } public class Demo { public static void main(String[] args) { Class<?> c = null; try { c = Class.forName("org.example.a.Human"); } catch (Exception e) { e.printStackTrace(); } Method m[] = c.getMethods(); for (int i = 0; i < m.length; i++) { Class<?> r = m[i].getReturnType(); Class<?> p[] = m[i].getParameterTypes(); int xx = m[i].getModifiers(); System.out.print(Modifier.toString(xx) + " "); System.out.print(r.getName() + " "); System.out.print(m[i].getName()); System.out.print("("); for (int x = 0; x < p.length; x++) { System.out.print(p[x].getName() + " " + "arg" + x); if (x < p.length - 1) { System.out.print(", "); } } System.out.print(")"); Class<?> ex[] = m[i].getExceptionTypes(); if (ex.length > 0) { System.out.print(" throws "); for (int j = 0; j < ex.length; j++) { System.out.print(ex[j].getName()); if (j < ex.length - 1) { System.out.print(","); } } } System.out.println(); } } } 执行结果 public java.lang.String getName() public void setName(java.lang.String arg0) public java.lang.String sayHello(java.lang.String arg0, java.lang.Integer arg1) public java.lang.Integer getAge() public void setAge(java.lang.Integer arg0) public void sayCategory() public final void wait() throws java.lang.InterruptedException public final void wait(long arg0, int arg1) throws java.lang.InterruptedException public final native void wait(long arg0) throws java.lang.InterruptedException public boolean equals(java.lang.Object arg0) public java.lang.String toString() public native int hashCode() public final native java.lang.Class getClass() public final native void notify() public final native void notifyAll() ## 取得属性 ## <table> <tbody> <tr> <td> <p><strong><strong>方法</strong></strong></p> </td> <td> <p><strong><strong>说明</strong></strong></p> </td> </tr> <tr> <td> <p>Field getField(String name)</p> </td> <td> <p>根据属性名称获取public属性</p> </td> </tr> <tr> <td> <p>Field[] getFields()</p> </td> <td> <p>获得该类所有的public属性</p> </td> </tr> <tr> <td> <p>Field getDeclaredField(String name)</p> </td> <td> <p>根据属性名称获取属性。private属性也可获取</p> </td> </tr> <tr> <td> <p>Field[] getDeclaredFields()</p> </td> <td> <p>获得该类所有的属性。private属性也可获取</p> </td> </tr> </tbody> </table> **详细方法** <table> <tbody> <tr> <td> <p><strong><strong>方法</strong></strong></p> </td> <td> <p><strong><strong>说明</strong></strong></p> </td> </tr> <tr> <td> <p>Object get(Object obj)</p> </td> <td> <p>获得一个对象中属性的具体内容</p> </td> </tr> <tr> <td> <p>void set(Object obj,Object value)</p> </td> <td> <p>设置指定对象中属性的具体内容</p> </td> </tr> <tr> <td> <p>int RetModifiers()</p> </td> <td> <p>获得属性的修饰符</p> </td> </tr> <tr> <td> <p>String getName()</p> </td> <td> <p>获得此属性的名称</p> </td> </tr> <tr> <td> <p>boolean isAccessible()</p> </td> <td> <p>判断此属性是否可被外部访问</p> </td> </tr> <tr> <td> <p>void setAccessible(boolean flag)</p> </td> <td> <p>设置一个属性是否可被外部访问</p> </td> </tr> <tr> <td> <p>static void setAccessibie(AccessibIeObject[] array,boolean flag)</p> </td> <td> <p>将一组属性设置是否可被外部访问</p> </td> </tr> <tr> <td> <p>String toString()</p> </td> <td> <p>返回此Field类的信息</p> </td> </tr> </tbody> </table> **示例** package org.example.a; import java.lang.reflect.Field; import java.lang.reflect.Modifier; interface ICategory { public static final String CATEGORY_NAME = "Human"; public void sayCategory(); public String sayHello(String name, Integer age); } class Human implements ICategory { private String name; private Integer age; public Human() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public void sayCategory() { System.out.println(CATEGORY_NAME); } @Override public String sayHello(String name, Integer age) { return "名字:" + name + "年龄:" + age; } } public class Demo { public static void main(String[] args) { Class<?> c = null; try { c = Class.forName("org.example.a.Human"); } catch (Exception e) { e.printStackTrace(); } Field f[] = c.getDeclaredFields(); System.out.println("本类属性: "); for (int i = 0; i < f.length; i++) { Class<?> r = f[i].getType(); int mo = f[i].getModifiers(); String priv = Modifier.toString(mo); System.out.print(priv + " "); System.out.print(r.getName() + " "); System.out.print(f[i].getName()); System.out.println(";"); } System.out.println("-------------------------------------------"); Field f1[] = c.getDeclaredFields(); System.out.println("公共属性: "); for (int i = 0; i < f1.length; i++) { Class<?> r = f1[i].getType(); int mo = f1[i].getModifiers(); String priv = Modifier.toString(mo); System.out.print(priv + ""); System.out.print(r.getName() + " "); System.out.print(f1[i].getName()); System.out.println(";"); } } } 执行结果 本类属性: private java.lang.String name; private java.lang.Integer age; ------------------------------------------- 公共属性: privatejava.lang.String name; privatejava.lang.Integer age; ## 取得注解 ## Method, Constructor, Field这三个类对象都可以判断是否有特定的注解类,方法是:boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) **示例** 本处使用枚举类示例,普通类类似的。 package org.example.a; import java.lang.reflect.Field; enum Color{ @Deprecated RED, GREEN, BLUE } public class Demo { public static void main(String[] args) { for (Color value : Color.values()) { Field field = null; try { field = Color.class.getField(value.name()); } catch (NoSuchFieldException e) { e.printStackTrace(); } if (field.isAnnotationPresent(Deprecated.class)) { System.out.println(value.name() + "上有注解类:" + Deprecated.class.getName()); } } } } 执行结果 RED上有注解类:java.lang.Deprecated # 应用 # ## 调用类的方法 ## package org.example.a; import java.lang.reflect.Method; class Human { private String name; private Integer age; public Human() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public void sayCategory() { System.out.println("HUMAN"); } public String sayHello(String name, Integer age) { return "名字:" + name + " " + "年龄:" + age; } } public class Demo { public static void main(String[] args) { Class<?> c = null; try { c = Class.forName("org.example.a.Human"); } catch (ClassNotFoundException e) { e.printStackTrace(); } try { Method method = c.getMethod("sayHello", String.class, Integer.class); System.out.println(method.invoke(c.newInstance(), "Tony", 20)); } catch (Exception e) { e.printStackTrace(); } } } 执行结果 名字:Tony 年龄:20 ## 修改属性 ## package org.example.a; import java.lang.reflect.Field; class Human { private String name; private Integer age; public Human() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public void sayCategory() { System.out.println("HUMAN"); } public String sayHello(String name, Integer age) { return "名字:" + name + " " + "年龄:" + age; } } public class Demo { public static void main(String[] args) { Class<?> c = null; try { c = Class.forName("org.example.a.Human"); } catch (ClassNotFoundException e) { e.printStackTrace(); } try { Object obj = c.newInstance(); Field nameField = c.getDeclaredField("name"); nameField.setAccessible(true); //将name属性设置成可被外部访问 nameField.set(obj, "Tony"); //设置name属性内容 // System.out.println(nameField.get(obj)); System.out.println(((Human) obj).getName()); } catch (Exception e) { e.printStackTrace(); } } } 执行结果 Tony ## 操作数组 ## <table> <tbody> <tr> <td><strong>方法</strong></td> <td><strong>说明</strong></td> </tr> <tr> <td>Class<?> getComponentType()</td> <td>取得一个数组的Class对象</td> </tr> </tbody> </table> **详细方法** <table> <tbody> <tr> <td><strong>方法</strong></td> <td><strong>说明</strong></td> </tr> <tr> <td>static Object get(Object array,int index)</td> <td>根据下标取得数组内容</td> </tr> <tr> <td>static Object newlnstance(Class<?> componentType, int length)</td> <td>根据己有的数组类型开辟新的数组对象</td> </tr> <tr> <td>static void set(Object array,int index,Object value)</td> <td>修改指定位置的内容</td> </tr> </tbody> </table> **示例:取得数组信息并修改数组内容** package org.example.a; import java.lang.reflect.Array; public class Demo { public static void main(String[] args) { int temp[] = {1, 2, 3}; Class<?> c = temp.getClass().getComponentType(); System.out.println("类型:" + c.getName()); System.out.println("长度:" + Array.getLength(temp)); System.out.println("第一个内容:" + Array.get(temp, 0)); Array.set(temp, 0, 6); System.out.println("第一个内容:" + Array.get(temp, 0)); } } 执行结果 类型:int 长度:3 第一个内容:1 第一个内容:6 **示例:修改数组的大小** package org.example.a; import java.lang.reflect.Array; public class Demo { public static void main(String[] args) { int temp[] = {1, 2, 3}; int newTemp[] = (int[]) arrayInc(temp, 5); print(newTemp); System.out.println("---------------------------"); String str[] = {"abc", "def", "gh"}; String newStr[] = (String[]) arrayInc(str, 8); print(newStr); } public static Object arrayInc(Object obj, int len) { Class<?> c = obj.getClass(); Class<?> arr = c.getComponentType(); Object newO = Array.newInstance(arr, len); int co = Array.getLength(obj); System.arraycopy(obj, 0, newO, 0, co); return newO; } public static void print(Object obj) { Class<?> c = obj.getClass(); if (!c.isArray()) { return; } Class<?> arr = c.getComponentType(); System.out.println(arr.getName() + "数组长度是:" + Array.getLength(obj)); for (int i = 0; i < Array.getLength(obj); i++) { System.out.println(Array.get(obj, i) + "、"); } } } 执行结果 int数组长度是:5 1、 2、 3、 0、 0、 --------------------------- java.lang.String数组长度是:8 abc、 def、 gh、 null、 null、 null、 null、 null、 # 其他网址 # [java反射基础知识总结\_github\_2011的博客-CSDN博客][java_github_2011_-CSDN] 《Java开发实战经典》=> 第15章 Java反射机制 [Class.forName和ClassLoader有啥区别?\_java\_HouXinLin\_CSDN的博客-CSDN博客][Class.forName_ClassLoader_java_HouXinLin_CSDN_-CSDN] [Java--_--_IT_-CSDN]: https://knife.blog.csdn.net/article/details/120930178 [java_github_2011_-CSDN]: https://blog.csdn.net/github_2011/article/details/72851284 [Class.forName_ClassLoader_java_HouXinLin_CSDN_-CSDN]: https://blog.csdn.net/HouXinLin_CSDN/article/details/106174672
相关 Java反射机制应用实例 Java的反射机制允许我们在运行时检查类、方法和字段的信息。下面是一个简单的反射机制应用实例: 1. **创建对象**: 首先,我们有一个已经定义的类,比如一个简单的"Per ╰+攻爆jí腚メ/ 2024年09月16日 19:45/ 0 赞/ 17 阅读
相关 Java反射机制的应用实例 Java的反射机制允许我们在运行时检查类的信息,如方法、属性等。下面我们将通过一个实际例子来展示如何应用反射。 **例子:获取类的所有构造器** 1. 创建一个类,例如我们 妖狐艹你老母/ 2024年09月15日 14:12/ 0 赞/ 16 阅读
相关 Java反射机制应用实例分析 Java的反射机制允许程序在运行时检查类、接口、方法和字段等信息,并动态调用它们。下面是一个简单的反射机制应用实例: 1. 创建一个类,例如一个简单的HelloWorld类: 妖狐艹你老母/ 2024年09月11日 13:18/ 0 赞/ 26 阅读
相关 Java反射API应用实例分析 Java反射API是Java语言提供的一种允许程序在运行时检查类、字段和方法信息的机制。 以下是一些Java反射API的应用实例分析: 1. 获取类的信息: ```java 怼烎@/ 2024年09月05日 14:39/ 0 赞/ 22 阅读
相关 Java反射机制的实例应用 反射是Java编程语言中一项强大而灵活的功能,它允许程序在运行时动态地获取类的信息、调用类的方法和操作对象。在本文中,我们将通过一个实例来详细探讨Java反射机制的使用。 假 比眉伴天荒/ 2024年02月21日 09:16/ 0 赞/ 23 阅读
相关 Java--反射--Type接口/子接口/子类--使用/应用/教程/实例 原文网址:[Java--反射--Type接口/子接口/子类--使用/应用/教程/实例\_IT利刃出鞘的博客-CSDN博客][Java--_--Type_--_IT_-CSDN] Myth丶恋晨/ 2022年09月12日 12:52/ 0 赞/ 201 阅读
相关 Java--Annotation(注解)--使用/应用/教程/实例 原文网址:[Java--Annotation(注解)--使用/应用/教程/实例\_IT利刃出鞘的博客-CSDN博客][Java--Annotation_--_IT_-CSDN] 矫情吗;*/ 2022年08月28日 03:55/ 0 赞/ 144 阅读
相关 Java--反射--使用/应用/教程/实例 原文网址:[Java--反射--使用/应用/教程/实例\_IT利刃出鞘的博客-CSDN博客][Java--_--_IT_-CSDN] 简介 本文用示例介绍Java反射的 灰太狼/ 2022年08月28日 03:55/ 0 赞/ 179 阅读
相关 Java--泛型--使用/教程/应用/实例 原文网址:[Java--泛型--使用/教程/应用/实例\_IT利刃出鞘的博客-CSDN博客][Java--_--_IT_-CSDN] 简介 本文用示例介绍Java的泛型 客官°小女子只卖身不卖艺/ 2022年08月28日 03:55/ 0 赞/ 170 阅读
还没有评论,来说两句吧...