java反射(纯小白)

反射

1.反射的概念及演示

  1. 什么是“反射”:也叫“方向加载”。
    正向加载:Student stu = new Student();
    反向加载:不直接new对象。我们的程序要通过“一个字符串描述的全类名”让JVM为其在 内存中产生一个Class对象,然后我们的程序通过这个Class对象再创建这个类对象。
  2. 反射的演示:
  3. 反射的好处:可以解开类和类之间的“依赖”

2.运行是class文件的加载

3.获取Class对象的三种方式

  1. 某对象.getClass()方法
  2. 某类.class属性
  3. Class.forName(“全类名”);
public class Test01 {
    public static void main(String[] args) throws ClassNotFoundException {
        //1.调用类的getClass()方法,从Object继承的,任何类都有。
        Student student = new Student();
        Class c1 = student.getClass();

        //2.任何一个数据类型都有一个静态的class属性
        Class c2 = Student.class;
        Class c3 = int.class;

        //3.Class类的静态方法:forName("全类名")
        Class c4 = Class.forName("com.magogle.反射演示.Student");

        System.out.println(c1 == c2);
        System.out.println(c1 == c4);
    }
}

class Student {

}

4.获取构造方法并创建对象-Constructor

1).批量获取:
1. public Constructor<?>[] getConstructors():获取所有的"公有"构造方法
2. public Constructor<?>[] getDeclaredConstructors():获取所有的构造方法,包括:公有\受保护\默认\私有.
2):获取单个:[掌握]
1.public Constructor getConstructor(Class<?>… parameterTypes):获取某个"公有"构造方法.
2.public Constructor getDeclaredConstructor(Class<?>… parameterTypes):获取某个构造方法,可以是公有\受保护\默认\私有
3).调用构造方法,创建对象
调用Constructor类的newInstance()方法

public class Test01 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //1.获取他的Class
        Class aClass = Class.forName("com.itheima.反射演示.获取构造方法并且创建对象_Constructor.student");
        //2.获取Student的构造方法:

        //获取所有的构造方法[包括公有.受保护.默认.私有]
        Constructor[] declaredConstructors = aClass.getDeclaredConstructors();
        for (Constructor dc : declaredConstructors) {
            System.out.println(dc);
        }

        //获取单个构造方法[包括公有.受保护.默认.私有]:
        Constructor cs2 = aClass.getDeclaredConstructor();
        System.out.println(cs2);
        Object o2 = cs2.newInstance();


        Constructor cs3 = aClass.getDeclaredConstructor(long.class);
        System.out.println(cs3);
        Object o3 = cs3.newInstance(10L);

        Constructor cs4 = aClass.getDeclaredConstructor(String.class);
        System.out.println(cs4);
        //暴力访问
        cs4.setAccessible(true);
        Object o4 = cs4.newInstance("sdf");

        Constructor cs5 = aClass.getDeclaredConstructor(String.class,long.class);
        System.out.println(cs5);
        Object o5 = cs5.newInstance("sdf",10L);

        //获取所有[公有]构造方法
        Constructor[] constructors = aClass.getConstructors();
        for (Constructor cs : constructors) {
            System.out.println(cs);
        }

        //获取单个[公有]构造方法
        Constructor cs6 = aClass.getConstructor();
        System.out.println(cs6);

        Constructor cs7 = aClass.getConstructor(String.class,long.class);
        System.out.println(cs7);
    }
}

class student{

    private String name;
    private long age;

    public student() {
        System.out.println("调用公有无参构造");
    }

    public student(String name, long age) {
        System.out.println("调用公有全参构造");
        this.name = name;
        this.age = age;
    }

    protected student(long age) {
        System.out.println("调用保护有参构造");
        this.age = age;
    }

    private student(String name) {
        System.out.println("调用私有有参构造");
        this.name = name;

    }
}

5.获取成员属性并赋值和取值-Filed

6.获取成员方法并调用-method

User user = new User();
user.getClass().getMethod("setBirthday", String.class);

7.反射练习

  1. 通过反射绕过集合的泛型检查:
public class Test02 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        ArrayList<Integer> array = new ArrayList<>();
        array.add(19);
        array.add(10);
        array.add(20);
        array.add(31);

        Class aClass = array.getClass();
        Method add = aClass.getMethod("add", Object.class);

        add.invoke(array, "hehe");

        for (Object o : array) {
            System.out.println(o + "类型" + o.getClass().getName());
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值