一、通过反射调用对象的属性
1.获取到属性
2.允许属性被访问
3.获取到对象
4.使用属性进行取值或者赋值操作
Class cls=Person.class;
Field f=cls.getDeclaredField("age");//非静态的
f.setAccessible(true);//允许被访问
//创建对象Object obj=cls.newInstance();
f.set(obj, 30);//对象的属性进行赋值
Object fv=f.get(obj);//obj对应对象中的age属性的值
System.out.println(fv);
System.out.println(obj);//调用对象的toString方法
改变已有对象中的属性public static void main(String[] args) throws Exception {
Person person=new Person();
System.out.println("改变之前:"+person);
changePersonAge(person);
System.out.println("改变之后:"+person);}public static void changePersonAge(Person person) throws Exception {//通过反射机制进行操作Class cls=person.getClass();Field f=cls.getDeclaredField("age");f.setAccessible(true);f.set(person, 10);}
二、反射创建对象
1.获取到Constructor
2.设置允许被访问
- 创建对象
Class cls=Person.class;
/*//无参构造器Constructor c=cls.getDeclaredConstructor();
//设置允许被访问c.setAccessible(true);
//调用无构造器,创建对象Object obj=c.newInstance();
System.out.println(obj);*/
//获取到有参构造器Constructor c =cls.getDeclaredConstructor(int.class);//参数个数可变的,参数的参数类型
//设置允许被访问c.setAccessible(true);
//调用构造器创建对象Object obj=c.newInstance(10);//参数是构造器要求参数的参数
三、反射调用方法
1.获取的Method对象
2.设置允许被访问
3.通过Method对象的invoke进行调用
此时可以获取到被调用方法的返回值,如果被调用的方法没有返回值的,则返回null
如果是非静态方法,调用时,一定要传输对象的。Class cls=Person.class;/*Method m=cls.getDeclaredMethod("hello2", String.class);
m.setAccessible(true);
//调用方法,invoke的返回值是调用方法的返回值Object obj=m.invoke(null, "菜菜");//第一个参数:对象,第二部分是参数的值
System.out.println("接收到的返回值:"+obj);
*///通过反射创建对象Constructor c=cls.getDeclaredConstructor(int.class);c.setAccessible(true);Object obj=c.newInstance(30);//非静态方法Method m=cls.getDeclaredMethod("toString");m.setAccessible(true);
Object returnv=m.invoke(obj);//对象必须传输,否则会报空指向异常
System.out.println("接收到方法的返回值:"+returnv)
四、反射中使用数组
getComponentType(),

Class cls=Person.class;
Constructor c=cls.getDeclaredConstructor();c.setAccessible(true);
Object obj=c.newInstance();
Field f=cls.getDeclaredField("arr");
f.setAccessible(true);
//赋值//f.set(obj, new int[] {1,2,3,5});//正向方式给数组类型的属性进行赋值//获取到数组元素的类型Class elClass=f.getType().getComponentType();Object arry=Array.newInstance(elClass 4);//通过反射的方式创建数组,第一个参数是元素的类型的Class,第二个参数是 数组的大小//通过反射的方式给数组进行赋值Array.set(arry, 0, 10);//第一参数是,哪个数组对象,第二参数下标,第三个数赋的值
//反射的方式获取到数组指定下标的值Object j=Array.get(arry, 0);//第一个参数是:哪个数组,第二参数:下标
//System.out.println(j);
f.set(obj, arry);//将反射方式创建的数组赋值给arr属性
System.out.println(obj);
