Java的反射机制
Java 反射机制
1.Java反射机制是什么?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
2.Java反射机制的作用:
(1)获得动态加载类的修饰符,包名,类名,使用的接口,继承的父类
(2)动态获取类的所有属性名,修饰符,属性类型
(3)动态获取所有定义的构造器,构造器使用的参数数量和参数类型
(4)动态获取所有方法,方法的返回值类型,方法名,方法参数数量,方法参数类型
(5)动态调用加载类的方法
3.Java中Class类的获取:
Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。然而,class类就是Java反射的根源。
Class类的获取:
1.通过每个类的隐含的静态成员变量获取
2.通过对象的getClass()方法获取
3.通过Class.forName("全名")方式获取
// 第一种方式:通过每个类的隐含的静态成员变量获取 Class<? extends Student> class1 = Student.class; // 第二种方式:通过对象的getClass()方法获取<br> Student stu = new Student(1, "s"); Class<? extends Student> class2 = stu.getClass(); // 第三种方式:通过Class.forName("全名")方式获取 Class<? extends Student> class3 = null; try { class3 = (Class<? extends Student>) class3.forName("com.usc.lilin.demo.Student"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("calss1:" + class1); System.out.println("calss2:" + class2); System.out.println("calss3:" + class3); System.out.println("calss1==class3?:" + (class1 == class3)); System.out.println("calss2==class1?:" + (class1 == class2)); System.out.println("calss2==class3?:" + (class3 == class2));
为什么会发生这样子呢?
class1、class2、class3 都是Student的类类型。在Java中,一个类只可能是Class的一个实例对象,所以三者均相等
4.Java类的动态加载:
通过.newInstance()方法创建对象
Student student = class1.newInstance();
5.class的常用API
/** * 获取对象的类的方法的信息 * * @param obij */ public static void getClassMethMSG(Object obj) { Class<? extends Object> class1 = obj.getClass(); // 获取对象的全名 String name = class1.getName(); // 获取对象的简名、 不包含包名 String simpleName = class1.getSimpleName(); // 获取对象的父类 Class<?> superclass = class1.getSuperclass(); // 获取对象实现的接口 Class<?>[] interfaces = class1.getInterfaces(); // 获取对象的类型名称 String typeName = class1.getTypeName(); // 获取对象的方法 ,不管修饰符,不能获取父类的方法 Method[] methods = class1.getDeclaredMethods(); // 获取对象的public方法,包括父类的方法 Method[] methods2 = class1.getMethods(); for (Method method : methods) { getMethodMSG(method); } // 获取对象所在的包 Package package1 = class1.getPackage(); // 获取对象的成员变量 Field[] fields = class1.getFields(); for (Field field : fields) { getFieldMSG(field); } // 获取自己的构造函数 Constructor<?>[] declaredConstructors = class1.getDeclaredConstructors(); for (Constructor<?> constructor : declaredConstructors) { getConstructorMSG(constructor); } } /** * 获取构造函数的信息 * * @param constructor */ private static void getConstructorMSG(Constructor<?> constructor) { // 获取参数信息 Parameter[] parameters = constructor.getParameters(); // 获取参数的类类型 Class<?>[] parameterTypes = constructor.getParameterTypes(); } /** * 获取成员变量的信息 * * @param field */ private static void getFieldMSG(Field field) { // 获取成员变量的类型 Class<?> type = field.getType(); String name3 = type.getName(); // 获取成员变量的名字 String name2 = field.getName(); } /** * 获取方法的具体信息 * * @param method */ private static void getMethodMSG(Method method) { // 获取方法名 String name2 = method.getName(); // 获取方法的返回类型的类类型 Class<?> returnType = method.getReturnType(); Class<?> declaringClass = method.getDeclaringClass(); // 获取方法参数的类类型 Class<?>[] parameterTypes = method.getParameterTypes(); // 获取方法参数 Parameter[] parameters = method.getParameters(); // 获取方法抛出的的异常类型 Class<?>[] exceptionTypes = method.getExceptionTypes(); // 获取方法的默认值 Object defaultValue = method.getDefaultValue(); }
6.方法反射的应用
通过
method.invoke()方法实现方法的反射
/** * Java反射机制中方法反射 */ private static void methidInvoke() { Student stu = new Student(); //获取class Class<? extends Student> class1 = stu.getClass(); try { //获取方法Method //根据指定的方法名以及参数的类型与个数获取方法 Method method = class1.getMethod("sayHello", String.class); method.invoke(stu, "gaosi"); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }
7.通过反射了解泛型的本质
泛型是在编译时候效,防止输入错误
ArrayList list = new ArrayList(); ArrayList<String> list1 = new ArrayList<String>(); list1.add("hello"); //list1.add(20);错误的 Class c1 = list.getClass(); Class c2 = list1.getClass(); System.out.println(c1 == c2); //反射的操作都是编译之后的操作 /* * c1==c2结果返回true说明编译之后集合的泛型是去泛型化的 * Java中集合的泛型,是防止错误输入的,只在编译阶段有效, * 绕过编译就无效了 * 验证:我们可以通过方法的反射来操作,绕过编译 */ try { Method m = c2.getMethod("add", Object.class); m.invoke(list1, 20);//绕过编译操作就绕过了泛型 System.out.println(list1.size()); System.out.println(list1); /*for (String string : list1) { System.out.println(string); }*///现在不能这样遍历 } catch (Exception e) { e.printStackTrace(); }
相关推荐
这篇博文"Java反射机制学习(二)"可能深入探讨了如何利用反射进行动态类型处理、访问私有成员以及创建对象等核心概念。在这里,我们将详细讨论Java反射的基本用法及其在实际开发中的应用。 1. **什么是反射**: ...
在"JAVA反射机制学习"资料中,你将深入理解这一关键概念。 首先,我们要明白什么是反射。在Java中,反射是一种在运行时分析类、接口、字段和方法的能力。通过使用`java.lang.Class`对象,我们可以获取任何类的信息...
Java反射机制是Java编程语言中的一种强大功能,它允许程序在运行时检查和操作类、接口、字段和方法的信息,即使在编译时这些信息是未知的。这一特性使得Java在某种程度上具备了动态语言的特性,尽管Java本身是一种...
Java反射机制是Java编程语言中一个强大的工具,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于java.lang.reflect包中的API,主要包括Class类、Constructor类、Method类和Field类。以下是...
在本篇“java反射机制学习(五):工厂模式”中,我们将探讨如何利用反射与工厂模式结合,提升代码的灵活性和可扩展性。 首先,工厂模式是一种常用的创建型设计模式,它提供了一种创建对象的最佳方式。传统的工厂模式...
总结来说,Java反射机制是Java语言的一个重要特性,它使得程序能够在运行时动态地获取类的信息并进行操作,提高了代码的通用性和适应性。在实际开发中,反射机制常用于框架设计、插件系统、数据持久化等领域,但同时...
Java反射机制是Java编程语言的一项重要特性,它允许程序在运行时动态地获取类的信息,并且能够对类的属性和方法进行操作。反射机制的核心在于Java的`java.lang.reflect`包,其中包含了`Class`、`Constructor`、`...
Java反射机制是Java编程语言中一个强大的特性,它允许运行时动态地获取类的信息并进行操作,如创建对象、调用方法、访问属性以及处理数组等。在本篇讲解中,我们将深入理解如何通过反射来执行方法、操作属性以及处理...
通过本文的学习,我们深入了解了Java反射机制的基本概念、原理以及应用。Java反射机制为Java程序提供了一种强大的动态处理能力,使得Java不仅仅局限于静态类型语言的功能限制。掌握Java反射机制对于开发者来说是非常...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象。这种能力使得Java具备了高度的灵活性和动态性,尤其是在处理未知类或者需要在运行时决定行为的情况下。以下...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。这一机制对于理解和实现高级框架、动态代理、元数据处理等场景至关重要。以下是对Java反射机制的详细说明:...
Java反射机制是Java编程语言中的一项核心特性,它允许程序在运行时动态地获取类的信息并进行操作。这使得Java能够在编译后仍然能够灵活地处理类和对象,增强了代码的动态性。在Android应用开发中,反射机制尤其重要...
Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在本教程中,我们将深入探讨如何通过反射获取实体类的属性、方法、接口以及父类信息。 首先,让...
总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...
Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在本篇文章中,我们将深入探讨如何通过反射获取构造方法并实例化对象,这对于理解和使用Java的...
在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念:在程序运行时,通过Class对象获取类的信息,包括类名、属性、方法等,并能够动态地创建对象和调用方法。...
本笔记主要涵盖了四个核心知识点:Java反射机制、流(I/O流)、内存管理和Java学习的基础。以下是对这些主题的详细阐述: 一、Java反射机制 Java反射机制是Java语言的一个强大特性,允许程序在运行时检查类、接口、...
Java反射机制是Java语言中一个强大的工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在动态代理部分,我们将探讨如何利用反射机制实现动态代理,这在处理面向切面编程(AOP)或者为已...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段以及方法等对象。这一机制的核心在于`java.lang.Class`类和相关的API,它们提供了对类元数据的访问,使得我们能够在运行时...
Java反射机制是Java编程语言中的一个强大特性,...通过学习和实践Java反射机制,你可以更深入地理解Java的运行机制,并在需要动态性、灵活性的场景中发挥其强大的功能。不过,使用反射时也应注意潜在的风险和性能影响。