`
清流鱼
  • 浏览: 30414 次
  • 性别: 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反射机制.doc

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

    Java反射机制实例代码分享

    主要介绍了Java反射机制实例代码分享,具有一定参考价值,需要的朋友可以了解下。

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

    Java反射机制总结(实例分析) Java反射机制学习笔记

    Java反射机制总结

    这是一本关于Java反射机制论文集合的书。其中包含基本的理论及各种实例。... 关键字有:Java Java反射机制 Java反射 Java反射理论 Java反射实例 Java反射例子 反射原理 反射 网络论文 集合 汇总 总结 Class。

    Java反射机制经典案例

    Java 反射机制、Java 的类反射机制、Java 反射机制的学习、Java 反射Reflection--运行时生成实例 java反射机制的手册文档

    通过Java反射机制获取JavaBean对象

    1.通过Java反射机制获取JavaBean对象。 2.通过JavaBean全路径字符串获取JavaBean对象。 3.获取JavaBean注解信息

    JAVA反射机制实例详解

    主要介绍了JAVA反射机制,以实例形式较为详细的分析讲解了Java反射机制的具体概念、功能与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    java反射机制应用

    java反射机制应用,文档中列举了使用java反射机制的各个应用场景,加以代码实例,使用学习非常方便。

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

    反射实例-JAVA反射机制

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

    本文档对Java中使用最广的反射进行了深度而让人简单容易理解的解析,附有实例,可供致力于java底层研究的人提供借鉴

    反射实例-JAVA反射机制

    Java中,反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件 之间进行源代表链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内 部信息,而不是...

    java 反射实例,大量注释,简单易懂

    一个java反射的例子,通过java反射机制,动态生成java实例,动态执行方法。例子中有大量注释,简单易懂。

    JAVA反射机制的入门代码

    代码为JAVA反射的一个DEMO,适合初学者临摹学习,还附有properties的创建方法,比较基础。

Global site tag (gtag.js) - Google Analytics