反射

反射:

一开始学习面向对象的时候就是new对象,调方法,而反射的话就是

定义一个学生类

public class Student {    
    public static void main(String[] args) {}
 
    private String name;
    private int age;
    public Student() {}
    public Student(String name,int age) {
        this.name=name;
        this.age=age;
    }

    public void say() {
        System.out.println("说话");
    }
    
    public void run(String somthing) {
        System.out.println("开始"+somthing);
    }
}

通过Class.forName类加载器,对类的一个描述

String className="cs1.Student";
Class<?> forName = Class.forName(className);
Object newInstance = forName.newInstance();
System.out.println(newInstance);
System.out.println(new Student().toString());
//以上代码相当于new Student();
输出如下,都是相同格式,包名加名加@地址
cs1.Student@7852e922
cs1.Student@4e25154f

1.getDeclaredMethods方法

String className="cs1.Student";
Class<?> forName = Class.forName(className);
//getDeclaredMethods方法
Method[] declaredMethods = forName.getDeclaredMethods();
//上面的Method方法返回值是一个数组类型,可以是方法名,参数名,返回值,修饰符
for (Method method : declaredMethods) {
    //获取对应方法名
    System.out.println(method.getName());
    //方法参数个数
    System.out.println(method.getParameterCount());
}
//输出 main 1 run 0 say 0

2.getDeclaredFields方法和getFields方法

//可以通过getDeclaredFields方法来获取该类中的属性名
Field[] declaredFields = forName.getDeclaredFields();
for (Field field : declaredFields) {
    System.out.println(field.getName());
}
//输出name age
若也想取出该类继承的父类的属性
//getFields方法取出来该类属性和继承的父类属性
Field[] fields = forName.getFields();
for (Field field : fields) {
    System.out.println(field.getName);
} 该类继承父类Person有gender和score属性
//则输出 name age gender score

3.getConstructors方法输出无惨方法个数0和有参方法参数个数2

Constructor<?>[] constructors = forName.getConstructors();
for (Constructor<?> constructor : constructors) {
    System.out.println(constructor.getParameterCount());
}
public Student() {}
    public Student(String name,int age) {
        this.name=name;
        this.age=age;
}
//如上就是Student类中有参方法和无参方法
//输出无参个数0和有参方法个数2

4.同时相当于类加载器的有三种方法

//1.class.forName
Class<?> forName = Class.forName(className);
//2.别人给了你一个new的对象
Student student = new Student();
Class<? extends Student> class1 = student.getClass();
//3.包名加类名加class
Class<?> class2=cs1.Student.class;

注意:

Student student = new Student();
Student student2 = new Student();
Class class1 = student.getClass();
Class class2 = student2.getClass();
//以上Student和Student2是不相等的因为是new了两个对象,而class1和class2是相等的,因为都是对一个类的描述
System.out.println(student==student2);
System.out.println(class1==class2);
//所以输出false和true

5.getDeclaredField方法

//getDeclaredField方法获取到属性的类型
Field field = forName.getDeclaredField("name");
Type genericType = field.getGenericType();
System.out.println(genericType);
//输出 class java.lang.String

6.getField方法,为属性名赋值

Class<?> forName = Class.forName(className);
Object obj = forName.newInstance();
//为属性name赋值
Field name = forName.getDeclaredField("name");
 name.set(obj,"lisi");
//为属性age赋值
 Field age = forName.getDeclaredField("age");
age.set(obj,21);
//这时候name值为lisi,age值为21
如下图,debug:

7.getMethod方法,为方法赋值

Class<?> forName = Class.forName(className);
Object obj = forName.newInstance();
Method run = forName.getMethod("run", String.class);
run.invoke(obj,"跑步");
//输出 开始跑步

 

posted @ 2022-10-24 16:33  花海~  阅读(32)  评论(0)    收藏  举报