Java反射简单认识

概述:

      Java的强大之一,就是强大的反射功能,如果能够熟练的使用Java的反射,那你对Java的理解将更深入一层; JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取对象的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。

     一 、 获取对象的Class 对象:

// 类的全限定名称

Class.forName(String className); 

// 这中方式可以指定类的加载器,这种指定类加载器的方式,可以实现对任意位置的字节码文件进行加载和实例化

Class.forName(String name, boolean initialize, ClassLoader loader);

//  最终都会调用这个方法获取字节码生成对应的 Class对象

 Class.forNmae(String name, boolean initialize, ClassLoader loader, Class<?> caller);

// 获取类的全限定名称:com.ask.service.imp.reflec.AlertResultDTO

aclass.getCanonicalName()

 

二 、 通过Class对象获取构造方法

A:获取所有构造方法
           public Constructor<?>[] getConstructors() 获取所有的构造方法不包含私有的
           public Constructor<?>[] getDeclaredConstructors() 获取所有的构造方法 包括私有的
       B:获取单个构造方法
           public Constructor getConstructor(Class<?>… parameterTypes) 获取单个的构造方法 不包含私有的
           public Constructor getDeclaredConstructor(Class<?>… parameterTypes) 获取单个的构造方法包含私有 的

三.通过Class对象获取成员变量
         A:获取所有成员变量
            public Field[] getFields() 获取所有的成员变量包含从父类继承过来的
            public Field[] getDeclaredFields() 获取所有的成员变量 包含私有的 
        B:获取单个成员变量
            public Field getField(String name)// 指定名称获取公共的成员变量包括从父类继承的
            public Field getDeclaredField(String name) // 指定名称获取公共(私有)的成员变量


       四、通过Class对象获取成员方法
        A:获取所有成员方法
           public Method[] getMethods() //获取所有的公共的成员方法不包含私有的 包含从父类继承过来的过来的公共方法
           public Method[] getDeclaredMethods()//获取自己的所有成员方法 包含私有的
       B:获取单个成员方法
          //参数1: 方法名称 参数2:方法行参的class 对象
          public Method getMethod(String name,Class<?>… parameterTypes) //获取单个的方法 不包含私有的
          public Method getDeclaredMethod(String name,Class<?>… parameterTypes) 获取单个方法包括私有的

 

Method对象:通过Class对象可以获取到当前类的方法,这些方法是被封装在java.lang.reflect.Method中

Method[] methods = alertResultDTOClass.getDeclaredMethods();

// 获取方法对应类的全限定名称

method.getDeclaringClass();

// 获取方法的详细描述(包括修饰符、返回值、路径、名称、参数、抛出值)

// public void com.ask.service.imp.reflec.AlertResultDTO.setCount(java.lang.Integer)

method.toGenericString(); 

// Modifier 有很多的静态方法可以对method进行判断

int modifiers = method.getModifiers();

System.out.println(Modifier.toString(modifiers));

// 获取方法的入参类型
Class<?>[] parameterTypes = method.getParameterTypes();
// 获取方法的返回类型
Class<?> returnType = method.getReturnType();
// 获取方法上的注解
Annotation[] annotations = method.getAnnotations();

方法有三种类型:synthetic, varagrs, bridge。

synthetic:合成方法

Synthetic (合成)方法是由编译器产生的、源代码中没有的方法。
当内部类与外部类之前有互相访问 private 属性、方法时,编译器会在运行时为调用方创建一个 synthetic 方法。

varagrs:可变参数方法

bridge: 桥接方法

桥接方法是为了泛型的向前兼容提出的

具体解释请移步:https://shixin.blog.csdn.net/article/details/54604224

 

 

参考资料:

https://www.programcreek.com/java-api-examples/index.php

https://www.cnblogs.com/boothsun/p/11146827.html

https://blog.csdn.net/ZXD693/article/details/90756791

https://shixin.blog.csdn.net/article/details/54604224

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值