自学Java day18 jvav反射专题 从jvav到架构师

        反射是jvav被视为动态语言的关键,可以让程序创建和控制任何类的对象,无需提前硬编码目标类,极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力。反射机制是构建框架技术的基础所在,使用反射可以避免将代码写死在框架中。使得对象能在程序执行过程中动态生成。

下面是演示:

首先创建一个User类用于演示

class User {
    private String name = "这是一个name";
    private int age = 20;

    public User() {
    }

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

    private User(String name) {
        this.name = name;
        this.age = 999;
    }

    private String info() {
        return "从jvav到架构师";
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }
}

下面将采用反射机制创建User对象

package com.company.class_;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

class Class03 {
    public static void main(String[] args) throws Exception {
        Class cls = Class.forName("com.company.class_.User");
        Object o1 = cls.newInstance(); //使用构造器:public User()

        Constructor m2 = cls.getDeclaredConstructor(String.class, int.class);
        m2.setAccessible(true);
        Object o2 = m2.newInstance("这是另一个人名", 1926);//使用构造器:public User(String name, int age)

        Constructor m3 = cls.getDeclaredConstructor(String.class);
        m3.setAccessible(true);
        Object o3 = m3.newInstance("这是另一个人名");//使用构造器:private User(String name)

        Method getName = cls.getMethod("getName");//使用反射机制访问public方法
        System.out.println("o1的名字是:" + getName.invoke(o1) + "  " + o1);
        System.out.println("o2的名字是:" + getName.invoke(o2) + "  " + o2);
        System.out.println("o3的名字是:" + getName.invoke(o3) + "  " + o3);

        System.out.println();
        Method info = cls.getDeclaredMethod("info");//使用反射机制访问private方法
        info.setAccessible(true);//使用反射爆破  可访问private成员
        System.out.println(info.invoke(o1));

        System.out.println();
        System.out.println(o1);
        Field x = o1.getClass().getDeclaredField("age");
        x.setAccessible(true);
        x.set(o1, 333);//修改private属性
        System.out.println(o1);

        System.out.println();
        Class f = Class.forName("java.io.File");//使用反射机制创建文件
        //f.newInstance();
        Constructor ff = f.getDeclaredConstructor(String.class);
        Object o = ff.newInstance("D:/Java/File/Class.txt");
        Method mf1 = f.getDeclaredMethod("createNewFile");
        mf1.invoke(o);
        System.out.println("创建文件完成");
    }
}

结果演示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值