目录
一、什么是反射
二、为什么会有反射
三、反射是如何工作的
获取类信息的三种方式:
例:
四、获取类信息并调用
1.获取
(1)获取变量
获取全部类信息
获取public修饰的
获取指定某一个
(2)获取方法
获取全部类信息
获取public修饰的
获取指定某一个
(3)获取构造器
获取全部类信息
获取public修饰的
获取指定某一个
2.获取后调用
(1)获取构造器后调用
(2)获取方法之后调用
(3)获取变量之后调用
一、什么是反射
反射是一种获取类信息的能力
类信息:方法、变量、接口、构造器、类名……
二、为什么会有反射
因为有时候需要获取类信息
创建对象也可以获取类信息,但是这种方式获取的类信息非常有限,所以需要用到反射
三、反射是如何工作的
要想获取类信息,就必须回到类对象阶段
获取类信息的三种方式:
1.Class.forName("全类名")---------磁盘阶段
2.类名.class-----------类对象阶段
3.对象名.getClass()----------------运行时阶段
例:
Student类
public Student{
private String name;
}
Test类
public class Test{
public static void main(String[] args){
//1.
Class class1=Class.forName("cn.edu.bdu.mc.Student");
//2.
Class class2=Student.class;
//3.
Student student=new Student();
Class class3=student.getClass();
}
}
四、获取类信息并调用
Student类
public class Student {
//变量
private String name="张三";
public Integer age=18;
Character sex='男';
protected Double height=185.5;
public String color="蓝色";
//方法
public void run(){
System.out.println("这是run()");
}
private int getAge(int age){
System.out.println("这是age()");
return age;
}
void aaa(String name,Integer height){
System.out.println("这是aaa()");
}
protected void bbb(String name,int age){
System.out.println("这是bbb()");
}
//构造器
private Student(){}
Student(String name,Integer age){}
public Student(String name, Integer age, Character sex, Double height, String color)
{
this.name = name;
this.age = age;
this.sex = sex;
this.height = height;
this.color = color;
}
}
Test类中的main()方法中:
1.获取
(1)获取变量
获取全部类信息
System.out.println("获取全部类信息并打印");
Field[] files=class1.getDeclaredFields();
for(Field file:files){
System.out.println(file);
}
获取public修饰的
System.out.println("获取public修饰的全局变量信息并打印");
Field[] files1=class1.getFields();
for(Field field:files1){
System.out.println(field);
}
获取指定某一个
System.out.println("获取指定某一个并打印");
(1)加Declared:
Field nameField= class1.getDeclaredField("name");
System.out.println(nameField);
Field heightField=class1.getDeclaredField("height");
System.out.println(heightField);
Field ageField=class1.getDeclaredField("age");
System.out.println(ageField);
(2)不加Declared:
System.out.println("------------------------------------");
Field nameField1= class1.getField("name");
System.out.println(nameField1);
System.out.println("------------------------------------");
Field heightField1=class1.getField("height");
System.out.println(heightField1);
System.out.println("------------------------------------");
Field ageField1=class1.getField("age");
System.out.println(ageField1);
可以得出方法上加Declared能获取全部的信息,不加Declared只能获取public修饰的
(2)获取方法
获取全部类信息
System.out.println("获取全部类信息并打印");
Method[] declaredMethods=class1.getDeclaredMethods();
for(Method declaredMethod:declaredMethods){
System.out.println(declaredMethod);
}
获取public修饰的
System.out.println("获取public修饰的方法和父类的信息并打印");
Method[] methods=class1.getMethods();
for(Method method:methods){
System.out.println(method);
}
获取指定某一个
System.out.println("获取指定的方法");
Method getAge=class1.getDeclaredMethod("getAge", int.class);
System.out.println(getAge);
Method aaa=class1.getDeclaredMethod("aaa", String.class, Integer.class);
System.out.println(aaa);
Method run=class1.getDeclaredMethod("run");
System.out.println(run);
Method bbb=class1.getDeclaredMethod("bbb", String.class, int.class);
System.out.println(bbb);
System.out.println("----------------------------------------");
Method run1=class1.getMethod("run");
System.out.println(run1);
System.out.println("----------------------------------------");
Method bbb1=class1.getMethod("bbb", String.class, int.class);
System.out.println(bbb1);
可以得出方法上加Declared能获取全部的信息,不加Declared只能获取public修饰的
(3)获取构造器
获取全部类信息
System.out.println("获取全部类信息并打印");
Constructor[] constructors=class1.getDeclaredConstructors();
for(Constructor constructor:constructors){
System.out.println(constructor);
}
获取public修饰的
System.out.println("获取public修饰的方法和父类的信息并打印");
Constructor[] constructors1=class1.getConstructors();
for(Constructor constructor1:constructors1){
System.out.println(constructor1);
}
获取指定某一个
System.out.println("获取指定某一个");
Constructor constructor=class1.getDeclaredConstructor();
System.out.println(constructor);
Constructor constructor1=class1.getDeclaredConstructor(String.class,Integer.class);
System.out.println(constructor1);
Constructor constructor2=class1.getDeclaredConstructor(String.class,Integer.class,Character.class,Double.class,String.class);
System.out.println(constructor2);
System.out.println("---------------------------------");
Constructor constructor0=class1.getConstructor();
System.out.println(constructor);
Constructor constructor20=class1.getConstructor(String.class,Integer.class,Character.class,Double.class,String.class);
System.out.println(constructor2);
2.获取后调用
(1)获取构造器后调用
System.out.println("获取构造器之后调用");
//public修饰的构造器
Constructor declaredConstructor=class1.getDeclaredConstructor(String.class,Integer.class);
//获取到构造器之后创建对象
Student student1=(Student) declaredConstructor.newInstance("aaa",18);//强转
//private修饰的构造器
Constructor declaredConstructor1=class1.getDeclaredConstructor();
//private修饰的数据,要使用就必须暴力反射(public和defined不用)
declaredConstructor1.setAccessible(true);//暴力反射
Student student2=(Student) declaredConstructor1.newInstance();
(2)获取方法之后调用
System.out.println("获取方法之后调用");
Method run=class1.getDeclaredMethod("run");
//调用
run.invoke(student1);//要想运行,就必须开辟内存空间,所以要把student1传进去
Method getAge=class1.getDeclaredMethod("getAge", int.class);
getAge.setAccessible(true);//暴力反射
getAge.invoke(student1,10);
Method bbb=class1.getDeclaredMethod("bbb", String.class, int.class);
bbb.invoke(student1,"张三",20);
Method aaa=class1.getDeclaredMethod("aaa", String.class, Integer.class);
aaa.invoke(student1,"admin",190);
(3)获取变量之后调用
System.out.println("获取变量之后调用");
Field nameField= class1.getDeclaredField("name");
nameField.setAccessible(true);//暴力反射
nameField.set(student1,"李四");//赋值
System.out.println(nameField.get(student1));//输出
Field ageField=class1.getDeclaredField("age");
ageField.set(student1,10);
System.out.println(ageField.get(student1));
Field sex=class1.getDeclaredField("sex");
sex.set(student1,'女');
System.out.println(sex.get(student1));
Field heightField=class1.getDeclaredField("height");
heightField.set(student1,120.00);//不能写120,,120.0也可以
System.out.println(heightField.get(student1));
Field color=class1.getDeclaredField("color");
color.set(student1,"红色");
System.out.println(color.get(student1));