反射的方法有三种:Class.forName(
"Reflect.Demo"
);
new
Demo().getClass();
Demo.
class.全部的对象的类都是Class类的一个实例对象.
java
反射后的类对象名:clazz(自定义).spa
加入了Declared的都是反射的类里面的 好比上面反射Reflect.Demo. Declared就指Demo, 没有Declared的就指实现的接口.或者父类的类Class.code
好比Field[] field = clazz.getDeclaredFields();//获取本类属性对象
Field[] filed1 = clazz.getFields();//实现的接口或者父类的属性blog
带Modifiers 都是权限修饰符好比public ,private,protect. protect只能同一个包引用:获取权限修饰符名.field 都是指代属性 Type指代类型:String,int等不过会把包名也获得接口
Class<?> clazz=Class.forName("reflect.MyPerson");
Field[] field = clazz.getDeclaredFields(); System.out.println(field[0].getName());//获取属性名 for (int i = 0; i < field.length; i++) { // 权限修饰符 int mo = field[i].getModifiers(); String priv = Modifier.toString(mo); // 属性类型 Class<?> type = field[i].getType(); System.out.println(priv + " " + type.getName() + " " + field[i].getName() + ";"); }
实现反射类的方法get
//调用Person类中的sayChina方法 Method method; try { method = clazz.getMethod("sayChina");//调用的方法名sayChina , method.invoke(clazz.newInstance()); //调用Person的sayHello方法 method=clazz.getMethod("sayHello", String.class,int.class);//调用的方法名,有参数的话,把参数的类名告诉它,知道调用那个方法 method.invoke(clazz.newInstance(),"Rollen",20);//new了一个要实例的变量,以后给里面要调用的方法,传入参数 } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e){ e.printStackTrace(); }
获取反射类的属性,修改反射类的属性string
Field field2=null; try { Object obj = clazz.newInstance(); field2=clazz.getDeclaredField("name");//有name-->public, sex--->private field2.setAccessible(true);//属性的修饰符为private 不加这句不行, 若是为public,这个就能够不加 field2.set(obj, "男");//获取obj的实例对象,而后改变obj里面sex的属性的值 System.out.println(field2.get(obj)); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e){ e.printStackTrace(); }