软件设计之Java入门视频(21)

软件设计之Java入门视频(21)

视频教程来自B站尚硅谷:

尚硅谷Java入门视频教程,宋红康java基础视频
相关文件资料(百度网盘)
提取密码:8op3
idea 下载可以关注 软件管家 公众号

学习内容:

该视频共分为1-717部分
本次内容涉及 630-659
在写代码时,总是需要来回切换界面来看代码要求,这里推荐Snipaste,可以把截图以窗口形式放在屏幕上
记录内容:

  1. 动态语言与静态语言
  2. Java反射机制

1、 动态语言与静态语言

在这里插入图片描述

Java反射机制

概述

在这里插入图片描述

反射前后使用对比

public class ReflectionTest {
    //反射之前,对Person的操作
    @Test
    public void test1(){
        //1.创建Person类的对象
        Person p1 = new Person("Tom",12);

        //2.通过对象,调用其内部的属性与方法
        p1.age = 10;
        System.out.println(p1.toString());
        p1.show();
        //在Person类的外部,不可以通过Person类的对象调用其内部私有结构
        //比如:私有的name、showNation()、构造器
    }
    //反射之后,对Person的操作
    @Test
    public void test2() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
        Class clazz = Person.class;
        //1.通过反射,创建Person类的对象
        Constructor cons = clazz.getConstructor(String.class,int.class);
        Object obj = cons.newInstance("Tom",12);
        Person p = (Person)obj;
        System.out.println(p.toString());//Person{name='Tom', age=12}
        //2.通过反射,调用对象指定的属性与方法
        //调用属性
        Field age = clazz.getDeclaredField("age");
        age.set(p,10);
        System.out.println(p.toString());//Person{name='Tom', age=10}
        //调用方法
        Method show = clazz.getDeclaredMethod("show");
        show.invoke(p);//你好,我是人

        //通过反射,可以调用Person类的私有结构
        Constructor con1 = clazz.getDeclaredConstructor(String.class);
        con1.setAccessible(true);
        Person p1 = (Person) con1.newInstance("Jerry");
        System.out.println(p1);//Person{name='Jerry', age=0}

        //调用私有的属性
        Field name = clazz.getDeclaredField("name");
        name.setAccessible(true);
        name.set(p1,"Han");
        System.out.println(p1);//Person{name='Han', age=0}

        //调用私有方法
        Method showNation = clazz.getDeclaredMethod("showNation", String.class);
        showNation.setAccessible(true);
        String nation = (String) showNation.invoke(p1,"China");//我的国籍是:China
        System.out.println(nation);//China
    }
}

java.lang.Class理解

在这里插入图片描述
在这里插入图片描述

使用ClassLoader加载配置文件

    @Test
    public void test3() throws Exception {
        Properties pros = new Properties();
        //此时的文件在当前的module下
        //读取配置文件方式1:
//        FileInputStream fis = new FileInputStream("jdbc.properties");
//        pros.load(fis);
        //此时的文件在module的src下
        //读取配置文件方式2:
        ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
        InputStream is = classLoader.getResourceAsStream("jdbc1.properties");
        pros.load(is);
        String user = pros.getProperty("user");
        String password = pros.getProperty("password");
        System.out.println(user + ":" + password);
    }

创建运行时类对象

    @Test
    public void test1() throws InstantiationException, IllegalAccessException {
        Class<Person> clazz = Person.class;
    /*
    newInstance(): 调用此方法,创建对应的运行时类的对象,内部调用了运行时类的空参构造器
    要想此方法正常的创建运行时类的对象,要求:
    1.运行时类必须提供空参的构造器
    2.空参的构造器的访问权限得够

    在javabean中要求提供一个public的空参构造器
    1.便于通过反射,创建运行时类的对象
    2.便于子类继承此运行时类时,默认调用super()时,保证父类有此构造器
     */
        Person obj = clazz.newInstance();
        System.out.println(obj);
    }

反射动态性

  @Test
    public void test2(){
        int num = new Random().nextInt(3);//0 1 2
        String classPath = "";
        switch (num){
            case 0:
                classPath = "java.util.Date";
                break;
            case 1:
                classPath = "java.lang.Object";
                break;
            case 2:
                classPath = "File.Person";
                break;
        }
        try {
            Object obj = getInstance(classPath);
            System.out.println(obj);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
    /*
    * 此方法创建一个指定类的对象
    * classPath:指定类的全类名
    * */
    public Object getInstance(String classPath) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        Class<?> clazz = Class.forName(classPath);
        return  clazz.newInstance();
    }
  • 20
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值