java--反射机制总结

Posted tvvt-kevin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java--反射机制总结相关的知识,希望对你有一定的参考价值。

一、什么是Java反射机制?

     JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为Java的反射机制。

二、反射机制提供了哪些功能?

  • 运行时判定任意一个对象所属的类

  • 运行时构造任意一个类的对象;

  • 运行时判定任意一个类所具有的成员变量和方法;

  • 运行时调用任意一个对象的方法;

  • 生成动态代理;

三、class对象的获取

    /**
     * 反射机制获取类有三种方法
     */
    @Test
    public void testGetClass() throws ClassNotFoundException {
        Class clazz = null;
 
        //1 直接通过类名.Class的方式得到
        clazz = Person.class;
        System.out.println("通过类名: " + clazz);
 
        //2 通过对象的getClass()方法获取,这个使用的少(一般是传的是Object,不知道是什么类型的时候才用)
        Object obj = new Person();
        clazz = obj.getClass();
        System.out.println("通过getClass(): " + clazz);
 
        //3 通过全类名获取,用的比较多,但可能抛出ClassNotFoundException异常
        clazz = Class.forName("com.java.reflection.Person");
        System.out.println("通过全类名获取: " + clazz);
    }

四、反射机制能够获取哪些信息?Class类的API详解。

 1. 利用newInstance创建对象:调用的类必须有无参的构造器

  1.1 通过字节码对象创建实例对象(无参构造方法)

  技术分享图片

  1.2 有参构造方法创建对象

  技术分享图片

  总结上面创建实例对象:Class类的newInstance()方法是使用该类无参的构造函数创建对象;如果一个类没有无参的构造函数, 就不能这样创建了,可以调用Class类的getConstructor(String.class,int.class)方法获取一个指定的构造函数然后再调用Constructor类的newInstance("张三",20)方法创建对象获取全部构造方法;

  技术分享图片

2. 获取类成员变量并使用--Field对象

  2.1 获取指定成员变量

  技术分享图片

  Class.getField(String)方法可以获取类中的指定字段(可见的), 如果是私有的可以用getDeclaedField("name")方法获取,通过set(obj, "李四")方法可以设置指定对象上该字段的值, 如果是私有的需要先调用setAccessible(true)设置访问权限,用获取的指定的字段调用get(obj)可以获取指定对象中该字段的值

 

  2.2 获取全部成员变量

  技术分享图片

 

3. 获得方法并使用--Method对象

  3.1 获取指定方法

  技术分享图片

  Class.getMethod(String, Class...) 和 Class.getDeclaredMethod(String, Class...)方法可以获取类中的指定方法,如果为私有方法,则需要打开一个权限。setAccessible(true);用invoke(Object, Object...)可以调用该方法,

  3.2 一次性获得所有的方法

  技术分享图片

 

五、class的摘要信息

boolean isPrimitive = class1.isPrimitive();//判断是否是基础类型
boolean isArray = class1.isArray();//判断是否是集合类
boolean isAnnotation = class1.isAnnotation();//判断是否是注解类
boolean isInterface = class1.isInterface();//判断是否是接口类
boolean isEnum = class1.isEnum();//判断是否是枚举类
boolean isAnonymousClass = class1.isAnonymousClass();//判断是否是匿名内部类
boolean isAnnotationPresent = class1.isAnnotationPresent(Deprecated.class);//判断是否被某个注解类修饰

String className = class1.getName();//获取class名字 包含包名路径
Package aPackage = class1.getPackage();//获取class的包信息
String simpleName = class1.getSimpleName();//获取class类名
int modifiers = class1.getModifiers();//获取class访问权限

Class<?>[] declaredClasses = class1.getDeclaredClasses();//内部类
Class<?> declaringClass = class1.getDeclaringClass();//外部类

Annotation[] annotations = class1.getAnnotations();//获取class对象的所有注解
Annotation annotation = class1.getAnnotation(Deprecated.class);//获取class对象指定注解

Type genericSuperclass = class1.getGenericSuperclass();//获取class对象的直接超类的 Type
Type[] interfaceTypes = class1.getGenericInterfaces();//获取class对象的所有接口的type集合

 

反射机制的优缺点:

优点:运行期类型的判断,动态类加载,动态代理使用反射。

缺点:性能是一个问题,反射相当于一系列解释操作,通知jvm要做的事情,性能比直接的java代码要慢很多。

总结:Java的反射机制在平时的业务开发过程中很少使用到,但是在一些基础框架的搭建上应用非常广泛,今天简单的总结学习了一下,还有很多未知的知识等以后用到再做补充。

 

以上是关于java--反射机制总结的主要内容,如果未能解决你的问题,请参考以下文章

反射机制入门

反射机制入门

反射机制入门

JAVA反射机制—学习总结

java--反射机制总结

JAVA反射机制,总结下