Java反射详细解读+实战使用,一篇就够!


目录

什么是反射?

反射有什么作用?

反射的缺点?

反射的使用?

获取类对象

获取构造器对象并创建对象

获取成员变量并赋值

获取成员方法并调用


话不多说,直接上车!                发车!!!


什么是反射?

反射是Java独有的技术,是Java技术显著的特点。
反射是指对于任何一个类,在运行的时候都可以直接得到这个类全部成分。

反射有什么作用?

在运行时,可以直接得到这个类的构造器对象。
在运行时,可以直接得到这个类的成员变量对象。
在运行时,可以直接得到这个类的成员方法对象。

在反射中,所获得的都是对象!!!

反射的缺点?

反射的使用?

获取类对象

Student类




package com.reflect;

public class Student {

}

 获取类对象的三种方式

package com.reflect;

public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        //类名.class
        Class studentClass = Student.class;


        //对象.class
        Student student = new Student();
        Class aClass = student.getClass();


        //class.forName(全限名)
        Class aClass1 = Class.forName("com.reflect.Student");


    }
}

 

获取构造器对象并创建对象

Student类

package com.reflect;

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

    private 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;
    }
}

获取构造器的四种方式

package com.reflect;

import java.lang.reflect.Constructor;

public class ReflectDemo2 {
    public static void main(String[] args) throws NoSuchMethodException {
        getDeclaredConstructor();
    }

    public void getConstructors(){
        Class<Student> studentClass = Student.class;
        //只能获取public修饰的构造器
        Constructor<?>[] constructors = studentClass.getConstructors();

    }

    public void getDeclaredConstructors() throws NoSuchMethodException {
        Class<Student> studentClass = Student.class;
        //获取全部构造器,不论权限是什么
        Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor();
    }

    public void getConstructor() throws NoSuchMethodException {
        Class<Student> studentClass = Student.class;
        //根据参数获取构造器,只能获取public修饰的
        Constructor<Student> constructor = studentClass.getConstructor(String.class,int.class);
    }


    public static void getDeclaredConstructor() throws NoSuchMethodException {
        Class<Student> studentClass = Student.class;
        //根据参数获取构造器,不论权限是什么
        Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor();
        System.out.println(declaredConstructor.getName());
    }
}

 获取构造器并创建实例

package com.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ReflectDemo3 {
    public static void main(String[] args) {

    }

    //调用无参构造器得到一个类的对象
    public static void createObj1() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //获取类对象
        Class<Student> studentClass = Student.class;
        //获取无参构造器
        Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor();
        //暴力反射,攻破权限
        declaredConstructor.setAccessible(true);
        //创建实例
        Student s1 = declaredConstructor.newInstance();


    }

    //调用有参构造器得到一个类的对象
    public static void createObj2() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //获取类对象
        Class<Student> studentClass = Student.class;
        //获取有参构造器
        Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor(String.class, int.class);
        //创建实例
        Student student = declaredConstructor.newInstance("孙悟空",1000);
    }
}

获取成员变量并赋值

Dog类

package com.reflect;

public class Dog {
    private String name;
    private int age;
    private String color;
    public static String school;
    public static final String SCHOOL_1 = "宠物学校";

    public Dog(){
    }

    public void run(){
        System.out.println("狗跑的贼快~~~");
    }

    private void eat(){
        System.out.println("狗吃骨头~~~~");
    }

    private void eat(String name){
        System.out.println("狗吃"+name);
    }

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

    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 getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public static String getSchool() {
        return school;
    }

    public static void setSchool(String school) {
        Dog.school = school;
    }

    public static String getSchool1() {
        return SCHOOL_1;
    }
}

获取成员变量并赋值

public static void getDeclareFields(){
        Class<Dog> dogClass = Dog.class;
        //获取全部声明的成员变量,不论权限是什么
        Field[] fields = dogClass.getFields();

        for (Field field : fields) {
            System.out.println(field.getName());
        }
    }

    public static void getDeclareField() throws NoSuchFieldException {
        Class<Dog> dogClass = Dog.class;
        //获取某个成员变量,根据名字
        Field age = dogClass.getField("age");

        System.out.println(age.getName());

    }

    public static void setField() throws NoSuchFieldException, IllegalAccessException {
        Class<Dog> dogClass = Dog.class;
        //获取某个成员变量,根据名字
        Field age = dogClass.getField("age");
        //因为age是私有的,需要暴力攻破权限
        age.setAccessible(true);
        Dog dog = new Dog();
        age.set(dog,"狗");
    }

获取成员方法并调用

 //获取所有声明的方法
    public static void getDeclaredMethods(){
        Class<Dog> dogClass = Dog.class;

        Method[] declaredMethods = dogClass.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod.getName());
        }
    }


//    根据方法名和参数类型获取方法,不关心权限是什么
    public static void getDeclaredMethod() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class<Dog> dogClass = Dog.class;

        Method declaredMethod = dogClass.getDeclaredMethod("run");
        System.out.println(declaredMethod.getName());

        Dog dog = new Dog();
        //用获取的方法对象调用run方法
        declaredMethod.invoke(dog);

    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值