反射的相关内容

目录

一、什么是反射

二、为什么会有反射

三、反射是如何工作的

获取类信息的三种方式:

例:

四、获取类信息并调用

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));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值