`
gaosililn
  • 浏览: 73046 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java 反射机制学习

    博客分类:
  • Java
 
阅读更多

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();
		}

 

  • 大小: 9.3 KB
分享到:
评论

相关推荐

    Java反射机制学习(二)

    这篇博文"Java反射机制学习(二)"可能深入探讨了如何利用反射进行动态类型处理、访问私有成员以及创建对象等核心概念。在这里,我们将详细讨论Java反射的基本用法及其在实际开发中的应用。 1. **什么是反射**: ...

    JAVA反射机制学习

    在"JAVA反射机制学习"资料中,你将深入理解这一关键概念。 首先,我们要明白什么是反射。在Java中,反射是一种在运行时分析类、接口、字段和方法的能力。通过使用`java.lang.Class`对象,我们可以获取任何类的信息...

    java反射机制学习

    Java反射机制是Java编程语言中的一种强大功能,它允许程序在运行时检查和操作类、接口、字段和方法的信息,即使在编译时这些信息是未知的。这一特性使得Java在某种程度上具备了动态语言的特性,尽管Java本身是一种...

    Java反射机制学习总结

    Java反射机制是Java编程语言中一个强大的工具,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于java.lang.reflect包中的API,主要包括Class类、Constructor类、Method类和Field类。以下是...

    java反射机制学习(五):工厂模式

    在本篇“java反射机制学习(五):工厂模式”中,我们将探讨如何利用反射与工厂模式结合,提升代码的灵活性和可扩展性。 首先,工厂模式是一种常用的创建型设计模式,它提供了一种创建对象的最佳方式。传统的工厂模式...

    java反射机制学习笔记+反射机制实操案例

    总结来说,Java反射机制是Java语言的一个重要特性,它使得程序能够在运行时动态地获取类的信息并进行操作,提高了代码的通用性和适应性。在实际开发中,反射机制常用于框架设计、插件系统、数据持久化等领域,但同时...

    java反射机制学习笔记

    Java反射机制是Java编程语言的一项重要特性,它允许程序在运行时动态地获取类的信息,并且能够对类的属性和方法进行操作。反射机制的核心在于Java的`java.lang.reflect`包,其中包含了`Class`、`Constructor`、`...

    java反射机制学习(四):通过反射执行方法、操作属性、操作数组中的数据

    Java反射机制是Java编程语言中一个强大的特性,它允许运行时动态地获取类的信息并进行操作,如创建对象、调用方法、访问属性以及处理数组等。在本篇讲解中,我们将深入理解如何通过反射来执行方法、操作属性以及处理...

    java面试题--反射机制

    通过本文的学习,我们深入了解了Java反射机制的基本概念、原理以及应用。Java反射机制为Java程序提供了一种强大的动态处理能力,使得Java不仅仅局限于静态类型语言的功能限制。掌握Java反射机制对于开发者来说是非常...

    Java反射机制学习总结.doc

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象。这种能力使得Java具备了高度的灵活性和动态性,尤其是在处理未知类或者需要在运行时决定行为的情况下。以下...

    Java反射机制的使用和学习方法

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。这一机制对于理解和实现高级框架、动态代理、元数据处理等场景至关重要。以下是对Java反射机制的详细说明:...

    Java反射机制的学习

    Java反射机制是Java编程语言中的一项核心特性,它允许程序在运行时动态地获取类的信息并进行操作。这使得Java能够在编译后仍然能够灵活地处理类和对象,增强了代码的动态性。在Android应用开发中,反射机制尤其重要...

    java反射机制学习(三):通过反射获取实体类的属性、方法、接口和父类信息

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在本教程中,我们将深入探讨如何通过反射获取实体类的属性、方法、接口以及父类信息。 首先,让...

    JAVA反射机制的入门代码

    总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...

    java反射机制学习(二):通过反射获取构造方法并实例化对象

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在本篇文章中,我们将深入探讨如何通过反射获取构造方法并实例化对象,这对于理解和使用Java的...

    北大青鸟java反射机制

    在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念:在程序运行时,通过Class对象获取类的信息,包括类名、属性、方法等,并能够动态地创建对象和调用方法。...

    java学习笔记(java 反射机制 流 内存管理)

    本笔记主要涵盖了四个核心知识点:Java反射机制、流(I/O流)、内存管理和Java学习的基础。以下是对这些主题的详细阐述: 一、Java反射机制 Java反射机制是Java语言的一个强大特性,允许程序在运行时检查类、接口、...

    java反射机制学习(六):动态代理

    Java反射机制是Java语言中一个强大的工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在动态代理部分,我们将探讨如何利用反射机制实现动态代理,这在处理面向切面编程(AOP)或者为已...

    java反射机制原理和反射机制总结

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段以及方法等对象。这一机制的核心在于`java.lang.Class`类和相关的API,它们提供了对类元数据的访问,使得我们能够在运行时...

    Java 反射机制 代码的实例

    Java反射机制是Java编程语言中的一个强大特性,...通过学习和实践Java反射机制,你可以更深入地理解Java的运行机制,并在需要动态性、灵活性的场景中发挥其强大的功能。不过,使用反射时也应注意潜在的风险和性能影响。

Global site tag (gtag.js) - Google Analytics