反射就是在程序运行期间动态的获取对象的属性与方法。

获取Class对象的三种方式:

对象名.getClass();

类名.Class();

Class.forName(全类名);

反射的优点:

动态的获取对象的属性和方法,使Java程序更加灵活;

程序不用在编译期就完成确定,在运行期仍然可以扩展。

反射的缺点:性能较差,没有直接获取快。

示例:

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void study(){
        System.out.println("学生在学习");
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class Reflect{
    public static void main(String[] args) throws ClassNotFoundException {
        //1.Class类中的静态方法forName("全类名")
            //全类名:包名 + 类名
        Class clazz = Class.forName("com.kuangziyao.reflect.Student");
        System.out.println(clazz);

        //2.通过class属性来获取
        Class clazz2 = Student.class;
        System.out.println(clazz2);

        //3.利用对象的getClass方法来获取class对象
        //getClass方法是定义在Object类中.
        Student s = new Student();
        Class clazz3 = s.getClass();
        System.out.println(clazz3);

        System.out.println(clazz == clazz2);
        System.out.println(clazz2 == clazz3);
    }
}

Class类获取构造方法对象的方法

方法名说明
Constructor[] getConstructors()返回所有公共构造方法对象的数组
Constructor[] getDeclaredConstructors()返回所有构造方法对象的数组
Constructor getConstructor(Class… parameterTypes)返回单个公共构造方法对象
Constructor getDeclaredConstructor(Class… parameterTypes)返回单个构造方法对象

示例:

public class Student {
    private String name;
    private int age;

    //私有的有参构造方法
    private Student(String name) {
        System.out.println("name的值为:" + name);
        System.out.println("private...Student...有参构造方法");
    }

    //公共的无参构造方法
    public Student() {
        System.out.println("public...Student...无参构造方法");
    }

    //公共的有参构造方法
    public Student(String name, int age) {
        System.out.println("name的值为:" + name + "age的值为:" + age);
        System.out.println("public...Student...有参构造方法");
    }
}
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        //method1();
        //method2();
        //method3();
        //method4();
    }

    private static void method4() throws ClassNotFoundException, NoSuchMethodException {
        // Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes):
        // 返回单个构造方法对象
        // 1.获取Class对象
       Class clazz = Class.forName("com.kuangziyao.myreflect3.Student");
       Constructor constructor = clazz.getDeclaredConstructor(String.class);
       System.out.println(constructor);
    }

    private static void method3() throws ClassNotFoundException, NoSuchMethodException {
        // Constructor<T> getConstructor(Class<?>... parameterTypes):
        // 返回单个公共构造方法对象
        // 1.获取Class对象
        Class clazz = Class.forName("com.kuangziyao.myreflect3.Student");
        // 小括号中,一定要跟构造方法的形参保持一致.
        Constructor constructor1 = clazz.getConstructor();
        System.out.println(constructor1);

        Constructor constructor2 = clazz.getConstructor(String.class, int.class);
        System.out.println(constructor2);

        //因为Student类中,没有只有一个int的构造,所以这里会报错.
        Constructor constructor3 = clazz.getConstructor(int.class);
        System.out.println(constructor3);
    }

    private static void method2() throws ClassNotFoundException {
        // Constructor<?>[] getDeclaredConstructors():
  
        // 返回所有构造方法对象的数组
        // 1.获取Class对象
        Class clazz = Class.forName("com.itheima.myreflect3.Student");

        Constructor[] constructors = clazz.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
    }

    private static void method1() throws ClassNotFoundException {
        // Constructor<?>[] getConstructors():
        // 返回所有公共构造方法对象的数组
        //1.获取Class对象
        Class clazz = Class.forName("com.kuangziyao.myreflect3.Student");
        Constructor[] constructors = clazz.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
    }
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注