java类加载器,反射,枚举练习题

一、写出获取Class实例的三种常见方式

1). 利用对象调用getClass()方法获取该对象的Class实例
2). 使用Class的静态方法forName(),用类的名字获取一个Class实例
3). 运用.calss的方式获取Class实例,对基本数据类型的封装类,还可以采用.TYPE来获取对应的基本数据类型的Class实例。

二、谈谈你对Class类的理解

Class类是Java反射机制中的核心,它代表了运行时的类类型。通过Class类,我们可以获取类的信息,如属性、方法和构造函数等,并且可以在运行时动态地加载类、创建对象和调用方法。

三、利用反射和重载完成以下功能

1)创建Student类,类中有属性name和age并封装属性
2)重载Student的构造函数,一个是无参构造并,另一个是带两个参数的有参构造,要求在构造函数打印提示信息
3)创建带main函数的NewInstanceTest类,利用Class类得到Student对象
4)通过上述获取的Class对象分别调用Student有参函数和无参函数

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

    public Student() {
        System.out.println("无参构造");
    }


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

    protected Student(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("有参构造");
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
测试类:
    public class ReflectTest {
    public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("reFlectDemo.Student");
        Constructor constructor = clazz.getConstructor();
        Student obj = (Student) constructor.newInstance();
        Constructor constructor1 = clazz.getDeclaredConstructor(String.class, int.class);
        Student obj1 = (Student) constructor1.newInstance("张瑾轩", 23);
        System.out.println(obj);
        System.out.println(obj1);
    }
}

四、利用通过反射修改私有成员变量

1.	定义PrivateTest类,有私有name属性,并且属性值为hellokitty,只提供name的getName的公有方法
2.	创建带有main方法ReflectTest的类,利用Class类得到私有的name属性
3.	修改私有的name属性值,并调用getName()的方法打印name属性值
PrivateTest类:
public class PrivateTest {
    private String name="hellokitty";

    public String getName() {
        return name;
    }
}
测试类:
    public class ReflectTest {
    public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("ReflectTest1.PrivateTest");
        Field name = clazz.getDeclaredField("name");
        Object obj = clazz.newInstance();
        name.setAccessible(true);
        name.set(obj,"zjx");
        Method getName = clazz.getDeclaredMethod("getName");
        System.out.println(getName.invoke(obj));
    }
}

五、 利用反射和File完成以下功能

1.	利用Class类的forName方法得到File类
2.	在控制台打印File类的所有构造器
3.	通过newInstance的方法创建File对象,并创建D:\mynew.txt文件
    测试类:
    public class ClassNotFoundException {
    public static void main(String[] args) throws Exception {
        // 1.利用Class类的forName方法得到File类
        Class aClass = Class.forName("java.io.File");
        //2.在控制台打印File类的所有构造器
        Constructor[] declaredConstructors = aClass.getDeclaredConstructors();
        for (Constructor constructor :declaredConstructors){
            System.out.println(constructor);
        }
        //通过newInstance的方法创建File对象,并创建D:\mynew.txt文件
        Constructor constructor = aClass.getDeclaredConstructor(String.class);
        Object file = constructor.newInstance("D:\\mynew.txt");
        Method createNewFile = aClass.getMethod("createNewFile");
        createNewFile.invoke(file);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值