Java反射基础入门

目录

一、基本概念

1.1 反射的含义

1.2 反射的过程

二、获取成分

2.1 获取Class对象

2.2 获取构造器对象

2.3 获取成员变量

2.4 获取成员方法

三、使用场景


一、基本概念

1.1 反射的含义

加载类,并允许以编程的方式获取类中的各种成分(方法、成员变量、构造器等等)

1.2 反射的过程

加载类,获得类的字节码(Class对象)

获取类的构造器(Constructor对象)

获取类的成员变量(Field对象)

获取类的成员方法(Method对象)

二、获取成分

2.1 获取Class对象

①直接获取对象

Class myClass = 类名.Class

②调用Class提供方法

forName方法

③Object提供方法

getClass

2.2 获取构造器对象

作用:初始化对象然后返回

package com.study;

import java.lang.reflect.Constructor;

import org.junit.Test;

public class myCatTest {

    @SuppressWarnings({ "unchecked", "rawtypes" })
    @Test
    public void test() throws Exception {
        Class c = myCat.class;
        // 获取无参构造器
        Constructor constructor1 = c.getDeclaredConstructor();
        constructor1.setAccessible(true);//强制不检查访问权限
        myCat cat1 = (myCat) constructor1.newInstance();
        System.out.println(cat1);
        // 获取有参构造器
        Constructor constructor2 = c.getDeclaredConstructor(String.class, int.class);
        constructor2.setAccessible(true);
        myCat cat2 = (myCat) constructor2.newInstance("加菲猫", 2);
        System.out.println(cat2);

    }
}

2.3 获取成员变量

作用:赋值取值

// myCat类
package com.study;

public class myCat {
    private String name;
    private int age;
    public myCat(){
        System.out.println("这是一个无参数的构造器");
    }
    public myCat(String name,int age){
        System.out.println("这是一个有参数的构造器");
        this.name = name;
        this.age = age;
    }


    @Override
    public String toString() {
        return "myCat [name=" + name + ", age=" + age + "]";
    }
}
// myCat测试类,使用反射获取成员变量
package com.study;

import java.lang.reflect.Field;
import org.junit.Test;

public class myCatTest {

    @SuppressWarnings({ "rawtypes" })
    @Test
    public void test() throws Exception {
        Class c = myCat.class;

        // 获取成员变量
        Field[] myField = c.getDeclaredFields();
        for (Field field : myField) {
            System.out.println(field);
        }
        myCat newCat = new myCat("中华田园猫", 10);
        // 获取单个成员变量并赋值
        Field myField2 = c.getDeclaredField("name");
        myField2.setAccessible(true);
        myField2.set(newCat, "加菲猫");
    }
}

2.4 获取成员方法

作用:执行成员方法

// myCat类
package com.study;

public class myCat {
    private String name;
    private int age;
    public myCat(){
        System.out.println("这是一个无参数的构造器");
    }
    public myCat(String name,int age){
        System.out.println("这是一个有参数的构造器");
        this.name = name;
        this.age = age;
    }
    // 两个私有同名方法
    @SuppressWarnings("unused")
    private void eat(){
        System.out.println(this.name+"正在吃猫粮");
    }
    @SuppressWarnings("unused")
    private String eat(String food){
        return this.name+"正在吃"+food;
    }
    @Override
    public String toString() {
        return "myCat [name=" + name + ", age=" + age + "]";
    }
}
// myCat测试类,获取成员方法
package com.study;

import java.lang.reflect.Method;
import org.junit.Test;

public class myCatTest {

    @SuppressWarnings({ "rawtypes" })
    @Test
    public void test() throws Exception {
        Class c = myCat.class;

        // 获取成员方法并打印
        Method[] myMethod = c.getDeclaredMethods();
        for (Method method : myMethod) {
            System.out.println(method);
        }
        // 获取成员方法并单独执行
        myCat newCat = new myCat("中华田园猫", 10);

        @SuppressWarnings("unchecked")
        Method hasMethod = c.getDeclaredMethod("eat", String.class);
        // 禁止检查访问权限
        hasMethod.setAccessible(true);
        // 直接执行
        Object rs = hasMethod.invoke(newCat);
        System.out.println((String) rs);

        @SuppressWarnings("unchecked")
        Method noMethod = c.getDeclaredMethod("eat");
        hasMethod.setAccessible(true);
        noMethod.invoke(newCat);

    }
}

三、使用场景

获取类的所有成分并操作

破坏类的封装性,实现直接使用

配合制作Java框架

基本案例:对于任意一个对象,获取该对象的所有字段和值,并保存到文件中

实现方法:

①定义一个方法,接收所有对象

②使用反射,通过.class方法获取class对象并获取全部成员变量

③遍历成员变量,提取其中的值

④将成员变量名和值导入到文件中

你可能感兴趣的:(后端JAVA基础,java)