Java 学习小记 ---- 反射

本文详细介绍了Java反射机制,包括使用`Class`类获取类信息、操作对象属性和方法,以及通过`getDeclaredFields()`和`getMethods()`动态访问私有成员。通过实例演示了如何创建对象、设置和获取字段值,以及调用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反射是通过.class文件获取一个类的信息
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制

package edu.uestc.LearnningTest.Reflect;

import lombok.Data;

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

@Data
class  Stu{
    public   String  address ;
    private  String name;
    private  int age;
    public Stu(){

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

    public static void main(String[] args) {
        System.out.println("hello");
    }


}

public class Learining1 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, ClassNotFoundException, NoSuchFieldException, InstantiationException {
        /**
         * 第一种反射方法 obj.getClass()
         */
        Stu stu1 = new Stu("zs",10);
        Class one =stu1.getClass();
        System.out.println(one.getSimpleName());
        /**
         * 第二种反射方法obj.class
         */
        Class two = Stu.class;
        System.out.println(one == two);
        /**
         * 第三种反射方法obj.forname() 【推荐】
         */
        Class three = Class.forName("edu.uestc.LearnningTest.Reflect.Stu");
        System.out.println(one == three);
        /**
         * 获得所有的声明的字段包括共有,私有,保护字段
         */
        Field[]  AllField  ;
        AllField = three.getDeclaredFields();
        for(Field s : AllField){
            System.out.println(s.getName());
        }
        /**
         * 获得声明的公有变量
         */
        Field[] PrivateField;
        PrivateField = three.getFields();
        for(Field s : PrivateField)
            System.out.println(s.getName());
        /**
         * 获得共有字段并调用
         */
        Field f  = three.getField("address");
        try{
            //获得一个对象
            //1 通过无参构造方法获取对象
            Object ob = three.getConstructor().newInstance();
            //在这个对象设置字段
            f.set(ob,"10086");
            //得到字段的值
            Stu three1 = (Stu) ob;
            System.out.println(three1.getAddress());
/**
            //2 通过有参构造方法获取对象
            Object ob1 = three.getConstructor(String[].class,int[].class).newInstance("qqa","12345");
            Stu three2 = (Stu) ob1;
            System.out.println(three2.getName()+three2.getAddress()+three2.getAge());
 **/
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        /**
         * 获得私有变量并调用
         */
        Field f1 = three.getDeclaredField("name");
        try{
            //获得一个对象
            Object obj = three.getConstructor().newInstance();
            f1.setAccessible(true); //解除私有限制
            f1.set(obj,"w5");
            //验证
            Stu three2 = (Stu) obj;
            System.out.println(three2.getName());
        } catch (InstantiationException e) {
            e.printStackTrace();
        }

        /**
         * 获取所有方法
         */
        Method[] m = three.getMethods();
        for(Method m1 : m){
            System.out.println(m1);
        }
        System.out.println("****************************");
        /**
         * 获取私有变量方法
         */
        Method[] m1 = three.getDeclaredMethods();
        for(Method m2 : m1){
            System.out.println(m2);
        }

        /**
         * 获取单个方法
         */
        Method m2 = three.getMethod("getAge",null);
        Method m3 = three.getDeclaredMethod("setName",String.class);

        //获得对象
        try{
            //实例化一个对象
            Object obj = three.getConstructor().newInstance();
            //实例化获得方法
            m2.invoke(obj,null);
            m3.invoke(obj,"qiuqian");
            Stu obj2 = (Stu)obj;
            System.out.println(obj2.getName());

        } catch (InstantiationException e) {
            e.printStackTrace();
        }

        /**
         * 反射main方法
         */

        Method mainMethod = three.getMethod("main",String[].class);
        Object obj3 = three.getConstructor().newInstance();
        Stu obj4 = (Stu)obj3;
        mainMethod.invoke(obj4,(Object) new String[]{"a","b","c"});
        //mainMethod.invoke(null,(Object) new String[]{"a","b","c"});




    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值