反射-------

本文详细介绍了Java反射机制,包括Class、Field、Method和Constructor等核心类的使用,以及PropertyDescriptor属性描述器的应用。内容涵盖获取类、成员变量、方法及构造器的方法,以及如何通过反射创建对象、调用方法、设置和获取字段值。同时,文章还展示了反射在实际操作中的常见步骤。
摘要由CSDN通过智能技术生成

反射

Java中主要由以下的类来实现Java反射机制(这些类都位于java.lang.reflect包中):

Class 对象是在加载类时由 Java 虚拟机自动构造

  • Class类:代表一个类。
  • Field类:代表类的成员变量(成员变量也称为类的属性)。
  • Method类:代表类的方法。
  • Constructor类:代表类的构造方法。
  • Array类:提供了动态创建数组,以及访问数组的元素的静态方法。

获取class

Class.forName() 常用
Hero.class
new Hero().getClass()

Class常用API

getName():获得类的完整名字。
    
getFields():获得类的public类型的属性。

getDeclaredFields():获得类的所有属性。

getMethods():获得类的public类型的方法。

getDeclaredMethods():获得类的所有方法。

getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型。

getConstrutors():获得类的public类型的构造方法。

getConstrutor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型。

newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

Field 常用API

1、 public Class<?>getDeclaringClass()

     返回表示类或接口的 Class 对象,该类或接口声明由此Field 对象表示的字段。

     指定者:接口Member 中的getDeclaringClass

 返回:表示声明底层成员的类的对象
 
 
  2、publicStringgetName() 

      返回此Field 对象表示的字段的名称。

      指定者:接口Member 中的getName

     返回:底层成员的简单名称  
    
  3、public Class<?>getType() 返回一个Class 对象,它标识了此 Field 对象所表示字段的声明类型。

    返回:标识此对象所表示字段的声明类型的 Class 对象
    
  4、public StringtoString()

      返回一个描述此 Field 的字符串。
      格式是:该字段(如果存在的话)的访问修饰符,后面跟着字段类型和一个空格,再后面是声明该字段的类的完全限定名,后面跟着一个句点,最后是字段的名称。例如:
      
  5、public boolean equals(Object obj)
      将此 Field 与指定对象比较。如果对象是相同的,则返回 true。如果由相同的类声明并且具有相同的名称和类型,那么这两个Field 对象是相同的。
      覆盖:类 Object 中的equals

     参数:obj - 要与之比较的引用对象。

     返回:如果此对象与 obj 参数相同,则返回 true;否则返回false。

Mehted 常用API

1、Method对象的获取 方法所在类的类对象.getMethod(String methodName,Class[] argsClass);
  获取方法Method对象的参数是方法名和方法的参数类。


2、method.invoke(方法所在类的对象,Object[] args);
执行方法参数:方法所在类的实例对象,和实际参数的Object数组;
如果该方法是静态方法,则方法所在类的对象可以为null

PropertyDescriptor 属性描述器

PropertyDescriptor对象是位于java.beans包下的工具类,顾名思义为属性描述器,通常我们用于通过反射获取对象方法的时候,下面来看一下常用的用法吧!

创建

public PropertyDescriptor(String propertyName, Class<?> beanClass)
    属性名字,Class对象

常用api

        prop.getName()  获取属性编码

        prop.getReadMethod()  获取get方法

        prop.getWriteMethod()  获取set方法

        prop.getPropertyType()  获取属性的定义类型

反射常用操作

创建对象

1.获取类对象 Class class = Class.forName("pojo.Hero");

2.获取构造器对象 Constructor con = clazz.getConstructor(形参.class);
			  Object objectCopy=classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
3 获取对象 Hero hero =con.newInstance(实参);

获取成员变量并使用

1.获取HeroPlus类的对象 
2. 获取属性 Field f1 = h.getDeclaredField("属性名")
3. 修改属性 f1.set(h,实参),注意这里的h是对象,不是类对象

执行对象方法

        //  invoke第一个参数表示执行哪个对象的方法,剩下的参数是执行方法时需要传入的参数
        method = clazz.getDeclaredMethod("setAge", Integer.class);        
        Object obje = clazz.newInstance();
        method.invoke(obje,2);

获取对象字段值

//通过Class对象.getDeclaredField(name)获取字段对象
Field declaredField = paramtertypeClass.getDeclaredField(content);
//暴力访问 获取值
declaredField.setAccessible(true);
//Field.get(Objcet) 来获取到objcet里面field字段的值
Object o = declaredField.get(user);

赋值给对象

User user =new User();
PropertyDescriptor pro = new PropertyDescriptor("id",User.Class);
Mehted wri = pro.getWriteMethod()
    writeMethod.invoke(o,value);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值