java reflect探究

获取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<Person> 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,可提升性能安全

高级补充

  • 经过反射获取泛型信息(参数/返回值)
相关文章
相关标签/搜索