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

高級補充

  • 經過反射獲取泛型信息(參數/返回值)
相關文章
相關標籤/搜索