设为首页 加入收藏

TOP

Java-反射(一)
2023-07-25 21:42:46 】 浏览:66
Tags:Java- 反射

反射概述

Java反射机制:

  • 是指在运行时去获取一个类的变量和方法信息。
  • 然后通过获取的信息来创建对象,调用方法的一种机制。
  • 由于这种<动态性>,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展。

获取Class类的对象

在这里插入图片描述

案例:

//Student类
public class Student {
    /**
     * 成员变量:私有,默认,公共
     */
    private String name;
    int age;
    public String address;

    //构造方法:一个私有,一个默认,两个公共
    public Student() {
    }

    private Student(String name) {
        this.name = name;
    }

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

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

    /**
     * 成员方法:一个私有,四个公共
     */
    private void function() {
        System.out.println("function");
    }

    public void method1() {
        System.out.println("method");
    }

    public void method2(String s) {
        System.out.println("method:" + s);
    }

    public String method3(String s, int i) {
        return s + "," + i;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}
public class Demo {
    public static void main(String[] args) throws ClassNotFoundException {
        //使用类的class属性获取该类对应的Class对象
        Class<Student> c1 = Student.class;
        System.out.println(c1);

        //一个类在内存中只有一个字节码文件对象
        Class<Student> c2 = Student.class;
        System.out.println(c1 == c2);
        System.out.println("-------------------");

        /*通过调用对象的getClass()方法,返回对象所属类的class对象
        该方法是Object类中的方法,所有的Java对象都可以调用该方法*/
        Student stu = new Student();
        Class<? extends Student> c3 = stu.getClass();
        System.out.println(c1 == c3);
        System.out.println("-------------------");

        //使用Class类中的静态方法forName(String className),返回对象所属类的class对象
        Class<?> c4 = Class.forName("com.fanshe.Student");
        System.out.println(c1 == c4);
    }
}

运行结果:

class com.fanshe.Student
true
-------------------
true
-------------------
true

反射获取构造方法并使用

  • getConstructors():返回一个数组,包含该Class对象中的public公共构造函数
  • getDeclaredConstructors():返回一个数组,包含该Class对象中的所有构造函数
  • getConstructor(参数列表):获取指定的公共构造函数对象
  • getDeclaredConstructor(参数列表):获取指定的构造函数对象
  • newInstance(参数):构造方法创建对象
  • setAccessible(boolean flag):值为true时取消访问检查

练习:

public class Demo2 {
    public static void main(String[] args) throws Exception {
        //获取Class对象
        Class<?> c = Class.forName("com.fanshe.Student");

        //getConstructors():返回一个数组,包含该Class对象中的public公共构造函数
        Constructor<?>[] cons = c.getConstructors();

        System.out.println("公共构造函数:");
        for (Constructor<?> con : cons) {
            System.out.println(con);
        }

        //getDeclaredConstructors():返回一个数组,包含该Class对象中的所有构造函数
        Constructor<?>[] dCons = c.getDeclaredConstructors();

        System.out.println("所有构造函数:");
        for (Constructor<?> dCon : dCons) {
            System.out.println(dCon);
        }

        System.out.println("指定的公共构造函数1:");
        //getConstructor():返回指定的公共构造函数的对象
        //参数:构造方法的参数 和 数据类型对应的字节码文件对象(Class对象)
        Constructor<?> con = c.getConstructor();
        //公共构造函数的对象使用newInstance()创建实例对象
        //newInstance():构造方法创建对象
        Object obj = con.newInstance();
        System.out.println(obj);

        System.out.println("指定的公共构造函数2:");
        //基本数据类型 也可以通过.class 得到对应的Class类型
        System.out.println(c.getConstructor(String.class, int.class, String.class).newInstance(&
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇学习笔记——springMVC中视图及视.. 下一篇《RPC实战与核心原理》学习笔记Da..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目