反射

本文深入探讨了Java中的反射机制,包括如何通过java.lang.Class获取类信息,类加载过程,以及如何通过反射创建对象。示例代码展示了如何使用Class.forName(), getClass(), ClassLoader加载类,并演示了读取properties文件和调用构造器的方法。此外,还讲解了如何获取类的属性和方法信息。
摘要由CSDN通过智能技术生成

反射(reflection)

  • 允许在程序执行期间,借助Reflection APi取得任何类的内部信息,并可以直接操作任意对象的内部属性及方法
  • java.lang.Class:代表一个类,java.lang.reflection.*;等等是反射的主要API

关于java.lang.Class的理解

  • 类加载的过程
    1. 程序经过javac.exe命令后,会生成一个或多个字节码文件(.class文件)
    2. 使用java.exe命令对某个字节码文件进行解释运行(将文案加载到内存中,即内存加载)
    3. 加载到内存的类.就是运行时类,就是Class的一个实例
public class Test2 {
    public static void main(String[] args) throws ClassNotFoundException {
        // 方式一: 电泳运行时类的属性class
        Class class1 = Person.class;
        System.out.println(class1);
        // 方式二: 通过运行时类的对象,调用getClass()
        Person person1 = new Person();
        Class class2 = person1.getClass();
        System.out.println(class2);
        // 方式三: 调用Class的静态方法 forName(String classPath)
        Class class3 = Class.forName("com.gcl.exe1.Person");
        System.out.println(class3);
        // 方式四: 使用类加载器 ClasssLoad
        ClassLoader classLoader = Test2.class.getClassLoader();
        Class class4 = classLoader.loadClass("com.gcl.exe1.Person");
        System.out.println(class4);
    }
}

使用反射Load加载properties文件

public class Test3 {
    public static void main(String[] args) throws IOException {
        Properties properties = new Properties();
        FileInputStream fileInputStream = new FileInputStream("/Users/guochongling/WorkSpace/IDEA/JAVA_SE/day11/src/com/gcl/exe1/jdbc.properties");
        properties.load(fileInputStream);

        String name = properties.getProperty("name");
        String age = properties.getProperty("age");
        System.out.println(name);
        System.out.println(age);

        // 反射
        ClassLoader classLoader = Test3.class.getClassLoader();
        // 路径默认在src下
        InputStream inputStream = classLoader.getResourceAsStream("com/gcl/exe1/jdbc.properties");
        properties.load(inputStream);

        String name2 = properties.getProperty("name");
        String age2 = properties.getProperty("age");
        System.out.println(name2);
        System.out.println(age2);

    }
}

通过反射创建对应的运行时类的对象

public class Test1 {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //1. newInstance() 创建对应的运行对象
        Class clazz = String.class;
        Object obj = (String) clazz.newInstance();
        System.out.println(obj.getClass());

        //2. 使用构造器
        Constructor constructor = clazz.getConstructor(String.class);
        Object object = (String)constructor.newInstance("你好");
        System.out.println(object);
    }
}

获取运行时类的属性内部结构

public class Test1 {
    public static void main(String[] args) {
        Class clazz = Person.class;
        // 获取当前运行类及其父类的public属性
        Field[] fields = clazz.getFields();
        for (Field field: fields) {
            System.out.println(field);
        }
        System.out.println("-------------------");
        // 获取当前运行类的所有属性
        Field[] fields1 = clazz.getDeclaredFields();
        for (Field field: fields1) {
            System.out.println(field);
        }

        // 权限修饰符 数据类型 变量名
        Field[] fields2 = clazz.getDeclaredFields();
        for (Field field: fields2) {
            //权限修饰符(返回值为int)
            System.out.println(field.getModifiers());
            System.out.println(Modifier.toString(field.getModifiers()));
            // 数据类型
            System.out.println(field.getType());
            // 变量名
            System.out.println(field.getName());
        }



    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

临水而愚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值