Java笔记反射(一)练习

  1. 写出获取Class实例的三种常见方式

    类名.Class()
    对象名.getClass()
    Class.forName(全类名)

  2. 谈谈你对Class类的理解

Class类提供很多方法用于获取类的各种信息,比如获取类名、判断该类是否是一个接口还是普通类等等。

  1. 利用反射和重载完成以下功能
    1)创建Student类,类中有属性name和age并封装属性
    2)重载Student的构造函数,一个是无参构造并,另一个是带两个参数的有参构造,要求在构造函数打印提示信息
    3)创建带main函数的NewInstanceTest类,利用Class类得到Student对象
    4)通过上述获取的Class对象分别调用Student有参函数和无参函数
Studen类:
    public class Student {
    private String name;
    private int age;


    public Student() {
    }

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

   
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}


NewInstanceTest类:
public class NewInstanceTest {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        Class clazz = Class.forName("com.Student");

        Object  o = clazz.newInstance();
        Constructor constructor = clazz.getConstructor(String.class,int.class);
        Object a = constructor.newInstance("zhangsan", 20);
        System.out.println(a);

        Field f = clazz.getDeclaredField("name");
        Field g = clazz.getDeclaredField("age");
        f.setAccessible(true);
        g.setAccessible(true);


        Object o1 = f.get(a);
        Object o2 = g.get(a);
        System.out.println(o1);
        System.out.println(o2);

      
    }
}

  1. 利用通过反射修改私有成员变量
    (1) 定义PrivateTest类,有私有name属性,并且属性值为hellokitty,只提供name的getName的公有方法
    (2)创建带有main方法ReflectTest的类,利用Class类得到私有的name属性
    (3)修改私有的name属性值,并调用getName()的方法打印name属性值
PrivateTest类:
    public class PrivateTest {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        Class clazz = Class.forName("com.work.Student");
        Field name = clazz.getDeclaredField("name");

        System.out.println(name.getName());
        Constructor<Student> constructor = clazz.getDeclaredConstructor(String.class);
        constructor.setAccessible(true);
        Object o = constructor.newInstance("cat");
        Method getName = clazz.getMethod("getName");
        Object invoke = getName.invoke(o);
        System.out.println(invoke);
    }
}

Student类:
    public class Student {
    private String name = "hellokitty";


    private Student() {
    }

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

    public String getName() {
        return name;
    }

    private void setName(String name) {
        this.name = name;
    }

    public String toString() {
        return "Student{name = " + name + "}";
    }
}
  1. 利用反射和File完成以下功能
    (1)利用Class类的forName方法得到File类
    (2)在控制台打印File类的所有构造器
    (3)通过newInstance的方法创建File对象,并创建D:\mynew.txt文件
 FileTest类:
    public class FileTest {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException,  InstantiationException, IOException, InvocationTargetException {

        Class clazz = Class.forName("java.io.File");
        
        System.out.println("File 类所有构造器:");
        for (Constructor constructor : clazz.getDeclaredConstructors()) {
            System.out.println(constructor);
        }

        Constructor constructor = clazz.getConstructor(String.class);
        File myNewFile = (File) constructor.newInstance("D:\\mynew.txt");

        System.out.println("创建的文件路径:" + myNewFile.getAbsolutePath());

        if (!myNewFile.exists()) {
            if (myNewFile.createNewFile()) {
                System.out.println("文件创建成功!");
            } else {
                System.out.println("文件创建失败!");
            }
        } else {
            System.out.println("文件已存在!");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值