获取Class的三种方式
- Person.class
- Class.forName("com.icngor.Person")
- Class clazz = new Person().getClass()
利用获得的Class实例clazz进行操作
获得类名
- clazz.getName() //获得类全名com.icngor.Person
- clazz.getSimpleName() //获得类名Person
获得类字段名
- Field[] f = clazz.getFields(); //返回数组,仅返回public修饰的字段
- Field[] declaredFields = clazz.getDeclaredFields(); //返回全部字段
获得方法名
- Method[] declaredMethods = clazz.getDeclaredMethods(); //返回全部方法
- clazz.getDeclaredMethod(name, parameterTypes); //返回指定方法
获得构造器名
- clazz.getDeclaredConstructors(int.class,String.class); //获得带此参数的构造器
构造对象
- clazz.newInstance(); //调用无参构造方法
- Constructor
c1 = clazz.getDeclaredConstructor(String.class,int.class); //调用有参构造方法 Person p =c1.newInstance("icngor",1); System.out.println(p.getName());
通过反射调用方法
- Person p =(Person) clazz.newInstance(); Method maMethod = clazz.getDeclaredMethod("setName", String.class); maMethod.invoke(p, "icngor");//相当于p.setName("icngor"); System.out.println(p.getName());
通过反射调用属性
Person p =(Person) clazz.newInstance(); Field f = clazz.getDeclaredField("name"); f.setAccessible(true); //设置安全(private)可见性,(禁止安全检查,提高运行效率) f.set(p, "icngor"); System.out.println(p.getName());
反射效率极低,必须要使用且频繁调用调用时将setAccessible设为true,可提高性能
高级补充
- 通过反射获取泛型信息(参数/返回值)