反射

本文详细讲解了Java反射的概念,包括如何通过Class对象获取属性、方法、构造函数,以及注解信息的获取。重点介绍了instance.getClass()、类名.class和class.forName()的不同用法,并展示了如何处理私有成员。此外,还讨论了数组Class对象的比较和常见API的使用案例。
摘要由CSDN通过智能技术生成

反射
概念:之前我们都是先设计一个类,然后通过这个类的实例来获取属性和方法,而其实我们还可以先得到p这个类的Class对象,然后再通过Class对象获取属性和方法,这样的好处是可以获取所有属性和方法,即使是private修饰的。

  • 反射是java动态性的一种体现。

获取Class对象
概念:获取Class对象有三种方式:

  • instance.getClass():要求必须得先有实例。
  • 类名.class:很便捷,但是属于硬编码,对于DK中自带的类型,推荐使用这种。
  • class.forName(qualifiedName)’:不是硬编码,对于自定义的类型,推荐使用这种。

获取构造方法
概念:Class常用API方法:

  • 'Constructor<?>[ ] getConstluctors():获取类的所有public修饰的方法。
  • Constructor<?> [] getDeclaredConstructors():获取类的所有方法。
  • Constructor getConstructor():获取指定的一个public构造方法。
  • ’ Constructor getDeclaredConstructor()`:获取指定的一个构造方法。

使用构造方法

  • 使用Constructor类中的newInstance()方法就等同使用new来调用构造器的效果。
  • setAccessible(true);:开启私有访问权限。

获取成员属性
概念:通过class获取成员属性的相关API方法:

  • Field[] getFields():获取类的所有public修饰的属性。
  • Field[] getDeclaredFields():获取类的所有属性。
  • Field getField():获取指定的一个public属性。
  • Field geTDeclaredField():获取指定的一个属性。

使用成员属性**
概念:Field类的常用API:

  • set(实例,值):往哪个实例的对应属性中设置值。
  • get(实例):从哪个实例中取出对应属性的值。

获取成员方法
概念:通过class获取成员方法的相关API方法:

  • Method[ getMethods():获取类的所有public修饰的方法,包括继承下来的public方法。
  • Method[] getDeclaredMethods()’:获取类的所有方法,不包括继承下来的public方法。
  • Method getMethod():获取指定的一个public方法。
  • Method getDeclaredMethod():获取指定的一个方法。

反射注解
概念:注解信息可以从类,属性或方法上获取,常用API方法如下:

  • getAnnotations():获取类,属性或方法上的所有的注解,包括继承来的。
  • getDeclaredAnnotations():获取类,属性或方法上的注解,不包括继承来的
  • getAnnotation(注解名):获取类,属性或方法上的某个注解,包括继承来的。
  • getDeclaredAnnotation(注解名):获取类,属性或方法上的某个注解,不包括继承来的。

数组的CLass对象
概念:判断数组的Class对象是否相同的时候,只比较它们的类型和维度。

/**
 * @author liusichang
 */
public class ArrayClass {
    @Test
    public void arrayClass(){
        //数组反射
        Class<?> array01=new int[10].getClass();
        Class<?> array02=new int[20].getClass();
        Class<?> array03=new int[20][10].getClass();
        Class<?> array04=new double[10].getClass();
        Class<?> model=int[].class;
        System.out.println(array01==array02);
        System.out.println(array01==array04);
        System.out.println(array01==array03);
    }
}

代码j260.6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值