`
清流鱼
  • 浏览: 30684 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

java反射机制实例

阅读更多

对于java反射机制,我先说java反射机制的功能,后以代码演示给大家!

1.功能

java反射:问过许多同学,让他们用通俗易懂的话说给我听,但没有结果,晚上和老王(一同学)聊天,才对java反射有了更深的认识。反射的反面就是“正射”(为了理解,杜撰的啊,还望大家理解),想信大家对多态不会陌生,通过多态我们可以引用子类的对象,但我们却无法获得父类的非静态方法的使用,通过java反射机制我们就可以做到这一点。通过一个实例,我们可以获知相应的类,也可以获知类中含有的所有属性、构造函数和方法,还可以获知该类所继承的抽象类和所有的接口,更为强大的功能是我们可以通过子类可以访问父类的私有属性和方法。但试验过,好像不能访问父类的私有构造函数(这一点不确定,查阅资料无果,若大家有想法,请多赐教),完全打破了面向对象的封装特点,让我神经很大很疯狂!

2。代码示例

package com.ibm.etp.refl;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class TestPerson {

	/**
	 * @param args
	 * @throws ClassNotFoundException
	 */
	public static void main(String[] args) throws ClassNotFoundException {
		Person person = new Person("hero", "java reflection");
		// all interfaces of person instance
		getInterfaceByObj(person);
		// get superclass of person instance
		getSuperclassByObj(person);
		// get all methods of person instance
		getMethodsByObj(person);
		// get method by specified name
		getMethodByObj(person);
		// get all fields of person instance
		getFieldsByObj(person);
		// 调用父类私有的方法
		invokePrivateMethod(person);
		// 调用父类私有的属性
		invokePrivateField(person);
		// 尝试调用父类私有的构造函数,但不能成功,所以我认为不可以调用私有的构造函数
		invokePrivateConstractor(person);

	}

	// I am used to put '[]' after Object rather not instance,for enhanced for
	// statement
	public static void getInterfaceByObj(Person person) {
		// 根据对象获得类
		Class<?> cls = person.getClass();
		// 根据类获得所有派生此类的接口
		Class<?>[] interfaces = cls.getInterfaces();
		System.out.println(interfaces[0]);
	}

	public static void getSuperclassByObj(Person person) {
		Class<?> cls = person.getClass();
		// 获得父类
		Class<?> superclass = cls.getSuperclass();
		System.out.println(superclass);
	}

	public final static void getConstractorsByObject(Person person) {
		Class<?> cls = person.getClass();
		// 获得类中所有构造函数
		Constructor<?>[] constructors = cls.getConstructors();
		for (Constructor<?> c : constructors) {
			System.out.println(c);
		}
	}

	public final static void getMethodsByObj(Person person) {
		Class<?> cls = person.getClass();
		// 获得类中所有的函数
		Method[] methods = cls.getMethods();
		for (Method method : methods) {
			System.out.println(method);
		}
	}

	public final static void getMethodByObj(Person person) {
		Class<?> cls = person.getClass();
		// 获得特定的函数
		try {
			Method method = cls.getMethod("relax", String.class);
			method.invoke(cls.newInstance(), "play tennies");
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	public final static void getFieldsByObj(Person person) {
		Class<?> cls = person.getClass();
		// 获得类中所有的属性
		Field[] fields = cls.getDeclaredFields();
		for (Field field : fields) {
			System.out.println(field);
		}
	}

	public final static void invokePrivateMethod(Person person) {
		Class<?> cls = person.getClass();
		Class<?> superClass = cls.getSuperclass();
		// 获得父类中私有方法的使用权
		try {

			Method running = superClass.getDeclaredMethod("running",
					new Class[] { String.class });
			running.setAccessible(true);
			running.invoke(person, new Object[] { "summer" });
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	public final static void invokePrivateField(Person person) {
		Class<?> cls = person.getClass();
		Class<?> superClass = cls.getSuperclass();
		// 获得父类中私有属性的使用权
		try {
			Field Dream = superClass.getDeclaredField("strDream");
			Dream.setAccessible(true);
			System.out.println(Dream.get(person));
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	// 调用此方法出现异常java.lang.InstantiationException
	public final static void invokePrivateConstractor(Person person) {
		Class<?> cls = person.getClass();
		Class<?> superClass = cls.getSuperclass();
		try {
			// 有下面的注释可以证明我的想法是可以站住脚的
			// Returns a Constructor object that reflects the specified public
			// constructor of the class represented by this Class object.
			Constructor<?> Dream = superClass.getConstructor(String.class);
			Dream.setAccessible(true);
			Dream.newInstance("I have a dream!");
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
}

   上面的只是主函数测试类,没有接口、抽象类等,全部代码在下面的链接处,需要的话可以下载的

 

分享到:
评论

相关推荐

    Java 反射机制实例详解

    Java 反射机制实例详解 Java 反射机制实例详解是一种动态语言机制,允许在程序运行时加载、探知和使用编译期间完全不知道的类、生成其对象实体,调用其方法或者对属性设值。下面是 Java 反射机制实例详解的知识点:...

    Java 反射机制 代码的实例

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...

    JAVA反射机制实例教程

    本实例教程分反射对成员变量、构造器、方法操作,详尽而简略得列出反射机制的应用,希望对大家有用。

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    java反射经典实例

    通过上述实例,我们可以看到Java反射机制在许多实际场景中的应用,它扩展了Java代码的灵活性和可扩展性。然而,也应注意,过度使用反射可能会引入复杂性和潜在的安全风险,因此在设计和实现时需权衡利弊。在理解了...

    Java反射机制的详细讲解及实例,有助于java深度开发

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象。这一机制对于理解和利用Java的动态性至关重要,尤其是在进行复杂系统设计、框架开发以及元数据驱动的应用中...

    Java反射机制 Java反射机制

    Java反射机制的主要作用包括:获取类的所有属性和方法、构造动态实例、调用类的方法等。通过反射,程序可以动态地创建对象和调用其方法,从而实现更灵活的功能。 #### 二、Java反射机制的由来与发展 Java反射机制...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    Java反射经典实例

    Java反射机制允许我们动态地获取类的信息,并在运行时创建和调用对象的方法。这种能力使得Java具有高度的灵活性和动态性,特别是在处理跨版本兼容性、元数据操作以及插件系统等方面。 二、反射的基本使用 1. 获取...

    反射实例-JAVA反射机制.doc

    Java 反射机制详解 Java 反射机制是 Java 语言提供的一种强大的工具,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并进行操作。这种能力使得 Java 应用程序更加灵活,能够在运行时发现和修改自身...

    Java反射机制总结(实例分析)

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),...

    Java反射机制总结

    ### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...

    java 反射机制详解

    Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

    Java反射机制学习(二)

    在"Java反射机制学习(二)"这篇博文中,作者可能详细解释了以上这些概念,并通过`BaseTest.java`和`Student.java`这两个示例文件进行了实例演示。`BaseTest.java`可能包含了一组基础的反射操作,而`Student.java`...

Global site tag (gtag.js) - Google Analytics