1.反射的定义:在我看来反射就是在程序运行过程中通过解剖类/接口的信息来动态操作类/接口的一种机制
实验用例:
public class Person{ private String name; public int old; public Person(){this.name="";this.old=-1;} public Person(String name,int old){this.name=name;this.old=old;} private void print() { System.out.println(this.name="已经"+this.old+"岁了!"); } public String toString() { return this.name+":"+this.old; } //setter,getter }
2.Class的获取
//1.通过.class获得 Class clazz=int.class; //2.通过.getClass()获得,不能用基本类型.getClass() clazz=Integer.getClass(); //3.通过Class.forName()获得 clazz=Class.forName("com.jz.reflect.Person")
3.Field的获取和操作
Field field=cl.getField("old");//获得公有字段信息
field=cl.getDeclaredField("name");//获得任意字段信息
Field[] fields=cl.getFields();//获得所有公有字段信息
fields=cl.getDeclaredFields();//获得所有字段信息
field.setAccessible(true);//如果要操作非公有字段必须设置
field.set(cl.newInstance(), "蒋曾");//将指定对象变量上此 Field 对象表示的字段设置为指定的新值
4.Method的获取和操作
Method method=clazz.getDeclaredMethod("print");//根据方法名和参数获得私有Method,这里参数为空 method.setAccessible(true);//如果要使用非公有方法必须要设置 Method[] methods=clazz.getMethods();//获得所有公有参数 method.invoke(clazz.newInstance(), null);//对带有指定参数的指定对象调用由此 Method 对象表示的底层方法
5.Constructor的获取和操作
Constructor constructor=clazz.getConstructor(String.class,int.class);//根据参数类型获取构造器 constructor.newInstance("蒋曾",21);//通过构造器创建对象实例
6.修饰符类型获取和操作
int modifier=clazz.getModifiers();//通过Class,Field,Method,Constructor的getModifiers()获得一个int值
System.out.println(Modifier.toString(modifier));//Modifier的静态方法toString()获得修饰符
此外还有更多更详细的东西可以查询相关API java.lang和java.lang.reflect