java 的常用技术--反射的详解

本文详细介绍了Java反射机制的基础概念及其实现方式。通过三种不同方法获取类的反射对象,并展示了如何利用反射机制获取类的方法、构造函数、属性等信息,同时演示了如何通过反射创建实例并操作对象。

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

java的常用技术–反射的详解

一.反射的介绍
反射:java的反射机制时在java的运行状态中,对于任意一个类都能够知道这个类的所有属性盒方法,也都能够调用他的属性盒方法.这中动态获取信息或者动态使用属性和方法就叫做 java的动态反射机制(其实就是说在开发中,我们可以通过反射获取我们想要获得的各种信息,属性盒方法)
二.我们使用反射机制都能够进行哪些使用?

  1. 获取类的反射的三种方法:
public class Test1 {
    public static void main(String[] args) throws Exception {
        //获取的三种方法
        //1.
        Class c = Class.forName("com.zyx.demo.Person");
        //2.
        Person p=new Person();
        Class c1 = p.getClass();
        //3.
        Class c2=Person.class;

    }

2.获取该类中所有的方法

Class c2=Person.class;*/
           //获取类中所有的公共的方法
        Method[] methods = c.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

运行后的结果:
(person类的自己的方法)
public static void com.zyx.demo.Person.update()
public java.lang.String com.zyx.demo.Person.getName()
public void com.zyx.demo.Person.read()
public java.lang.String com.zyx.demo.Person.getId()
public void com.zyx.demo.Person.setName(java.lang.String)
public void com.zyx.demo.Person.setAge(java.lang.String)
public void com.zyx.demo.Person.setId(java.lang.String)
public java.lang.String com.zyx.demo.Person.getAge()
(object父类的方法)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
3.获取所有实现的接口:getInterfaces()
4.获取父类:getSuperClass
5.获取类中所有的构造函数:getConstrustors
6.获取类中所有的属性

    //获取类中所有的属性
        Field[] fields = c.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }

7.创建类的实例化 本质上就是new了一个对象 newInstance()

//创建类的实例化
        Object obj = c.newInstance();
        //强转 向下转型
        Person p=(Person)obj;
        System.out.println(p);

8.getDeclaredFields 和 getFields的区别
getDeclaredFields: 是获得某个类的所有申明的字段,既包括 public private protected 但是 不包含父类的字段
get Fieleds 获取所有类的公共字段 public 包括父类
二通过反射获取对象实例,然后操作对象

// 创建类的实例化
        Object obj = c.newInstance();
        // 强转 向下转型
        Person p = (Person) obj;
        p.setAge("11");
        p.setId("12");
        p.setName("123");
        System.out.println("id=" + p.getId() + "name=" + p.getName() + "age=" + p.getAge());

通过反射获取字段属性,并且赋值

        //获取 age属性
        Field field = c.getDeclaredField("age");
        //获取类的实例化
        Object obj = c.newInstance();
          field.set(obj, "22");
          System.out.println(field.get(obj));

如果获取的属性时私有的不能直接操作,需要进行暴力反射 setAccessible(true)

Class类提供了四个public方法,用于获取某个类的构造方法
Constructor getConstructor(Class[] params) 根据构造函数的参数,返回一个具体的具有public属性的构造函数
Constructor getConstructors() 返回所有具有public属性的构造函数数组
Constructor getDeclaredConstructor(Class[] params) 根据构造函数的参数,返回一个具体的构造函数(不分public和非public属性)
Constructor getDeclaredConstructors() 返回该类中所有的构造函数数组(不分public和非public属性)

四种获取成员方法的方法

Method getMethod(String name, Class[] params) 根据方法名和参数,返回一个具体的具有public属性的方法
Method[] getMethods() 返回所有具有public属性的方法数组
Method getDeclaredMethod(String name, Class[] params) 根据方法名和参数,返回一个具体的方法(不分public和非public属性)
Method[] getDeclaredMethods() 返回该类中的所有的方法数组(不分public和非public属性)
四种获取成员属性的方法
Field getField(String name) 根据变量名,返回一个具体的具有public属性的成员变量
Field[] getFields() 返回具有public属性的成员变量的数组
Field getDeclaredField(String name) 根据变量名,返回一个成员变量(不分public和非public属性)
Field[] getDelcaredField() 返回所有成员变量组成的数组(不分public和非public属性)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值