java反射笔记

一、了解一下反射

在这里插入图片描述
在这里插入图片描述

二、代码解释

package reflex;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author :huan
 * @date :2021/5/17 21:28
 * @description:TODO
 **/
public class reflex {
    public static void main(String[] args) throws Exception {
        Person testPrson=new Person();
        //先获取Person的Class对象(有三种方法)
        Class person1 = Class.forName("reflex.Person");//(1)将字节码文件加载进内存,返回Class对象
        Class person2 =Person.class;//(2)通过类名的属性class获取
        Class person3=testPrson.getClass();//(3)通过通过对象的getClass()方法获取
        System.out.println(person1);
        System.out.println(person2);
        System.out.println(person3);
        System.out.println("=============获取成员变量们=================");

        //一、获取成员变量们
        //1、获取所有的public修饰的成员变量
        Field[] fields = person1.getFields();
        for (Field field:fields){
            System.out.println(field);
        }
        System.out.println("==============================");
        //2、获取指定的成员变量id的值
        Field id = person1.getField("id");
        Object value = id.get(testPrson);
        System.out.println("id的默认值是:"+value);
        //设置id的值
        id.set(testPrson,200);
        System.out.println(testPrson);


        System.out.println("==============================");
        //3、获取所有的成员变量,不考虑修饰符
        Field[] declaredFields = person1.getDeclaredFields();
        for (Field field:declaredFields){
            System.out.println(field);
        }
        //获取指定的成员变量(private修饰的成员变量也可以哦),不考虑修饰符
        Field password = person1.getDeclaredField("password");
        //忽略访问修饰符的检查(曰之为暴力反射)
        password.setAccessible(true);
        Object value2 = password.get(testPrson);
        System.out.println("password的默认值是:"+value2);
        System.out.println();

        System.out.println("============获取构造器们==================");
        constrator();
        System.out.println("============获取成员方法们==================");
        getmethods();
    }

    public static void constrator() throws Exception {
        //2、获取构造器们
        Person person=new Person();
        Class Cperson=person.getClass();
        //获取有参构造器
        Constructor constructor = Cperson.getConstructor(int.class, String.class);
        System.out.println(constructor);
        //使用这个构造器创建对象
        Object persionReflex = constructor.newInstance(22, "焕");
        System.out.println(persionReflex);

        System.out.println("==============================");
        //获取无参的构造器
        Constructor constructor1 = Cperson.getConstructor();
        Object personReflex2 = constructor1.newInstance();
        System.out.println(personReflex2);
        //获取无参的构造器这样也更快(JDK封装好了)
        Object personReflex3 = Cperson.newInstance();
        System.out.println(personReflex3);

        //获取私有的构造器
        //Constructor declaredConstructor = Cperson.getDeclaredConstructor();
    }

    public static void getmethods() throws Exception {
        Person person=new Person();
        Class personClass=Person.class;
        //3、获取指定的成员方法(无参)
        Method eat = personClass.getMethod("eat");
        //执行方法
        eat.invoke(person);
        //获取有参的成员方法(有参)
        Method eat1 = personClass.getMethod("eat", String.class);
        eat1.invoke(person,"草莓");

        //获取私有的成员方法
        Method run = personClass.getDeclaredMethod("run");
        //忽略访问修饰符的检查(曰之为暴力反射)
        run.setAccessible(true);
        run.invoke(person);

        //获取私有的成员方法(有参)
        Method run1 = personClass.getDeclaredMethod("run", String.class);
        run1.setAccessible(true);
        run1.invoke(person,"学校");

        System.out.println("============获取所有的方法==================");
        //4、获取所有的方法
        Method[] declaredMethods = personClass.getDeclaredMethods();
        for (Method method:declaredMethods){
            method.setAccessible(true);
            System.out.println("方法的名称:"+method.getName());
            System.out.println(method);
        }

        System.out.println("============获取类名==================");
        //5、获取类名
        String className = personClass.getName();
        System.out.println(className);
    }


}

package reflex;

/**
 * @author :huan
 * @date :2021/5/17 21:28
 * @description:TODO
 **/
public class Person {
    public int id=1;
    public int age;
    private String name;
    private String password="我是密码!";

    public Person(){};

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

    public void eat(){
        System.out.println("eating................");
    }

    public void eat(String food){
        System.out.println("eating................"+food);
    }

    private void run(){
        System.out.println("running.................");
    }

    private void run(String address){
        System.out.println("running.................in"+address);
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "reflex.Person{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值