Java反射Reflect的使用详解(2)

这里提前说明一下:Class中两个功能相同的方法,若其中一个带有Declared字样,表示针对类中所有声明的变量、方法、构造函数等,而对应不带Declared字样的方法,则表示仅对公有(public)成员变量、方法起作用,下面不再重复描述,下面仅对带有Declared字样的方法进行讲解。

三. 反射-构造函数 3.1 getDeclaredConstructor(Class<?>...parameterTypes) public class ClassUtils { /** * 获取构造函数 * @param clazz 类 * @param params 构造函数参数类型 * @throws NoSuchMethodException */ public static void getDeclaredConstructor(Class clazz, Class[] params) throws NoSuchMethodException { System.out.println(clazz.getDeclaredConstructor(params)); } } public class ClassTest { public static void main(String[] args) { try { Class clazz = Class.forName("reflectdemo.SuperHero"); //打印无参构造函数 ClassUtils.getDeclaredConstructor(clazz, null); //打印有参构造函数 ClassUtils.getDeclaredConstructor(clazz, new Class[]{String.class, String.class, Integer.class, String.class}); } catch (Exception e) { e.printStackTrace(); } } }

输出结果为:

public reflectdemo.SuperHero() public reflectdemo.SuperHero(java.lang.String,java.lang.String,java.lang.Integer,java.lang.String) 3.2 getDeclaredConstructors() public class ClassUtils { /** * 遍历构造函数 * @param clazz 类 */ public static void getDeclaredConstructors(Class clazz){ //获取所有的构造函数 Constructor[] constructors = clazz.getDeclaredConstructors(); for (Constructor constructor : constructors) { //直接打印构造函数 System.out.println(constructor); //打印构造函数名称 System.out.println(constructor.getName()); //打印构造函数参数 Parameter[] parameters = constructor.getParameters(); for(Parameter parameter : parameters){ System.out.print(parameter); System.out.print(", "); } System.out.println("---------------------"); } } } public class ClassTest { public static void main(String[] args) { try { Class clazz = Class.forName("reflectdemo.SuperHero"); //遍历构造函数 ClassUtils.getDeclaredConstructors(clazz); } catch (Exception e) { e.printStackTrace(); } } }

输出结果为:

public reflectdemo.SuperHero() reflectdemo.SuperHero --------------------- public reflectdemo.SuperHero(java.lang.String,java.lang.String,java.lang.Integer,java.lang.String) reflectdemo.SuperHero java.lang.String arg0, java.lang.String arg1, java.lang.Integer arg2, java.lang.String arg3, --------------------- 四. 反射-成员变量 4.1 getDeclaredField(String name) public class ClassUtils { /** * 获取属性字段 * @param clazz 类 * @param fieldName 属性名称 * @throws Exception */ public static void getDeclaredField(Class clazz, String fieldName) throws Exception{ System.out.println(clazz.getDeclaredField(fieldName)); } } public class ClassTest { public static void main(String[] args) { try { Class clazz = Class.forName("reflectdemo.SuperHero"); //测试公有属性 ClassUtils.getDeclaredField(clazz, "ADDRESS"); //测试私有属性 ClassUtils.getDeclaredField(clazz, "name"); } catch (Exception e) { e.printStackTrace(); } } }

输出结果为:

public static final java.lang.String reflectdemo.SuperHero.ADDRESS private java.lang.String reflectdemo.SuperHero.name 4.3 getDeclaredFields() public class ClassUtils { /** * 遍历clazz对象已有的成员变量 * @param clazz */ public static void getDeclaredFields(Class clazz){ Field[] fields = clazz.getDeclaredFields(); for (Field field: fields) { //如果要设置值,需要加入下面这句,反射对象在使用时不使用Java语言访问检查 //field.setAccessible(true); //直接打印Field System.out.println(field); //手动获取变量类型和变量名称 System.out.println(field.getType().getName() + " " +field.getName()); System.out.println("--------------------"); } } } public class ClassTest { public static void main(String[] args) { try { Class clazz = Class.forName("reflectdemo.SuperHero"); //遍历成员变量 ClassUtils.getDeclaredFields(clazz); } catch (Exception e) { e.printStackTrace(); } } }

输出结果为:

public static final java.lang.String reflectdemo.SuperHero.ADDRESS java.lang.String ADDRESS -------------------- private java.lang.String reflectdemo.SuperHero.id java.lang.String id -------------------- private java.lang.String reflectdemo.SuperHero.name java.lang.String name -------------------- private java.lang.Integer reflectdemo.SuperHero.age java.lang.Integer age -------------------- private java.lang.String reflectdemo.SuperHero.skill java.lang.String skill -------------------- 五. 反射-成员方法 5.1 getDeclaredMethod(String name, Class<?>... parameterTypes) public class ClassUtils { /** * 获取成员方法 * @param clazz 类 * @param methodName 方法名称 * @param params 参数列表 * @throws Exception */ public static void getDeclaredMethod(Class clazz, String methodName, Class[] params) throws Exception{ Method method = clazz.getDeclaredMethod(methodName, params); System.out.println("直接打印"); System.out.println(method); System.out.println("手动构建"); //获取返回类型 System.out.print(method.getReturnType().getSimpleName() + " "); //获取方法名称 System.out.print(method.getName() + "("); //获取参数类型 Class[] paramTypes = method.getParameterTypes(); for(int i = 0; i < paramTypes.length; i++){ Class param = paramTypes[i]; if(i < paramTypes.length - 1){ System.out.print(param.getSimpleName() + ", "); }else { System.out.print(param.getSimpleName()); } } System.out.print(")"); System.out.println(); } } public class ClassTest { public static void main(String[] args) { try { Class clazz = Class.forName("reflectdemo.SuperHero"); //打印无参数方法 ClassUtils.getDeclaredMethod(clazz, "getName", null); //打印有参数方法 ClassUtils.getDeclaredMethod(clazz, "setName", new Class[]{String.class}); } catch (Exception e) { e.printStackTrace(); } } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/0fcca08088d0daaf191bc2145350ae92.html