Day12反射二 - 图1

一、通过反射调用对象的属性

步骤

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.设置允许被访问

  1. 创建对象

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);//参数是构造器要求参数的参数

System.out.println(obj);

三、反射调用方法

步骤

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(),
Day12反射二 - 图2
Day12反射二 - 图3
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);