Reflect反射练习
通过反射获得对象的成员变量,构造方法,方法
package Reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Scanner; public class ReflectDemo { public static void main(String[] args) throws ClassNotFoundException { System.out.println("请输入完整的类名"); String string = new Scanner(System.in).nextLine(); //获取类对象 Class<?> c = Class.forName(string); //包名、类名 System.out.println(c.getPackage().getName());//包名 System.out.println(c.getName());//完整类名 System.out.println(c.getSimpleName());//简写类名 System.out.println("-----------成员变量----------"); f1(c); System.out.println("-----------构造方法----------"); f2(c); System.out.println("-----------方法----------"); f3(c); } private static void f1(Class<?> c) { /*获取所有的成员变量 * Field对象 封装变量的定义信息 * 定义信息包括:private static final String s:修饰符、类型、名称 * */ Field[] a = c.getDeclaredFields(); for (Field f : a) { //类型 String t = f.getType().getSimpleName(); //变量名 String n = f.getName(); } } private static void f2(Class<?> c) { /* * Constructor对象,封装构造方法定义的信息 * 构造方法定义信息包括: * public A(参数) throws异常 :修饰词、方法名、参数列表、异常四部分 * */ Constructor<?>[] a = c.getDeclaredConstructors(); for (Constructor<?> t : a) { //名称(类名) String n = c.getSimpleName(); //参数列表,类对象数组,得到的是Int/String类对象数组 Class<?>[] p = t.getParameterTypes(); System.out.println(Arrays.toString(p)); } } private static void f3(Class<?> c) { /*Method对象 封装方法定义的信息 * 方法定义信息有:public static Date f(参数) throws异常 : 修饰符、返回数据类型、方法名、参数列表、异常*/ Method[] a = c.getDeclaredMethods(); for (Method t : a) { //返回类型 String r = t.getReturnType().getSimpleName(); //方法名 String n = t.getName(); //参数列表 Class<?>[] p = t.getParameterTypes(); System.out.println(Arrays.toString(p)); } } }
通过反射获得对象实例:
package Reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Scanner; public class ReflectDemo2 { public static void main(String[] args) throws ClassNotFoundException { System.out.println("输入完整类名 "); String aString = new Scanner(System.in).nextLine(); Object o1=null; Object o2=null; //获得类对象 Class<?> c = Class.forName(aString); //创建无参构造 try { o1 = c.newInstance(); System.out.println("创建了无参构造"); } catch (Exception e) { System.out.println("没有无参构造"); } //int 有参构造方法 try { //获得int 参数构造方法 Constructor<?> t = c.getConstructor(int.class); //xinji新建实例,并执行这个构造方法 o2 = t.newInstance(5); System.out.println("新建int类型的构造方法实例"); } catch (Exception e) { System.out.println("没有int参数的构造方法"); } } }