`
wuxing429
  • 浏览: 16170 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

java反射复习(二)

阅读更多
用反射机制调用对象的方法
	Class<?> classType = A.class;
		try {
			// Object aa = classType.newInstance();
	
      Object a = classType.getConstructor(new
         Class[]{}).newInstance(new Object[]{});
        //获取InvokeTester类的add()方法
        Method addMethod = classType.getMethod("add", new Class[]{int.class});
        //调用invokeTester对象上的add()方法
        Object result;
			result = addMethod.invoke(a, new Object[]{new Integer(100)});
		
        System.out.println((Integer) result);
        //获取InvokeTester类的echo()方法
        Method echoMethod = classType.getMethod("echo", new Class[]{String.class});
        //调用invokeTester对象的echo()方法
        result = echoMethod.invoke(a, new Object[]{"Hello"});
        System.out.println((String) result);


动态创建和访问数组

  
 	Class<?> classType = Class.forName("java.lang.String");
        // 创建一个长度为10的字符串数组
        Object array = Array.newInstance(classType, 10);
        // 把索引位置为5的元素设为"hello"
        Array.set(array, 5, "hello");
        Array.set(array, 6, "world");
        // 获得索引位置为5的元素的值
        String s = (String) Array.get(array, 5);
        System.out.println(s);



   	int[] dims = new int[]{5, 10, 15};
	        //创建一个具有指定的组件类型和维度的新数组。
	  Object array = Array.newInstance(Integer.TYPE, dims);   
	  Object arrayObj = Array.get(array, 3);
	  Class<?> cls = arrayObj.getClass().getComponentType();
	  System.out.println(cls);
	  arrayObj = Array.get(arrayObj, 5);
	  Array.setInt(arrayObj, 10, 37);
	  int arrayCast[][][] = (int[][][]) array;
	  System.out.println(arrayCast[3][5][10]);


自动去代理执行被代理对象

 
class B implements InvocationHandler {
	/**
	 * 
	 * 要处理的对象(也就是我们要在方法的前后加上业务逻辑的对象,如例子中的Hello)
	 */
	private Object delegate;

	/** */
	/**
	 * 动态生成方法被处理过后的对象 (写法固定)
	 * 
	 * @param delegate
	 * @param proxy
	 * @return
	 */
	public Object bind(Object delegate) {
		this.delegate = delegate;
		return Proxy.newProxyInstance(
				this.delegate.getClass().getClassLoader(), this.delegate
						.getClass().getInterfaces(), this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result = null;
		try {
			// 执行原来的方法之前记录日志
			logging(method.getName() + " Method end .");
			// JVM通过这条语句执行原来的方法(反射机制)
			result = method.invoke(this.delegate, args);
			// 执行原来的方法之后记录日志
			logging( method.getName() + " Method Start!");
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 返回方法返回值给调用者
		return result;
	}
	
	public void logging(String msg){
		System.out.println(msg);
	}

}


代理调用代码

	    A a = new A(); 
	     B b =new B();
	     b.bind(a);
		try {
			Method addMethod = A.class.getMethod("add", new Class[]{int.class});
	        b.invoke(null, addMethod, new Object[]{new Integer(10)});
		
		} catch (Throwable e) {
			e.printStackTrace();
		}



  Java语言反射提供一种动态链接程序组件的多功能方法。它允许程序创建和控制任何类的对象(根据安全性限制),无需提前硬编码目标类。这些特性使得反射特别适用于创建以非常普通的方式与对象协作的库。例如,反射经常在持续存储对象为数据库、XML或其它外部格式的框架中使用。
反射有两个缺点。第一个是性能问题。当用于字段和方法接入时反射要远慢于直接代码。性能问题的程度取决于程序中是如何使用反射的。如果它作为程序运行中相对很少涉及的部分,缓慢的性能将不会是一个问题。即使测试中最坏情况下的计时图显示的反射操作只耗用几微秒。仅反射在性能关键的应用的核心逻辑中使用时性能问题才变得至关重要。
许多应用更严重的一个缺点是使用反射会模糊程序内部实际要发生的事情。程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术会带来维护问题。反射代码比相应的直接代码更复杂,正如性能比较的代码实例中看到的一样。解决这些问题的最佳方案是保守地使用反射-- 仅在它可以真正增加灵活性的地方。
分享到:
评论

相关推荐

    Java SE 复习资料

    8. **反射API**:Java反射API允许在运行时检查类的信息,创建和访问对象,调用方法。虽然不常用,但在某些场合(如插件系统、序列化、动态代理)是必不可少的。 9. **泛型**:泛型是Java 5引入的新特性,用于增强...

    java_复习题库java_复习题库

    这个“java_复习题库”包含了丰富的学习资料,旨在帮助学习者巩固Java编程的知识点,提升技能水平。以下是一些核心的Java编程知识点,通过复习题库可以深入理解和掌握: 1. **基础语法**:Java的基础包括变量、数据...

    JAVA书本复习题答案整合

    "JAVA书本复习题答案整合"是一个精心整理的资源包,它集合了多套Java书本复习题目及其对应的答案,旨在帮助学习者高效地备考期末考核。 1. **Java基础知识**:复习题可能涵盖了Java的基础语法,如变量、数据类型、...

    java 考试复习资料

    以上只是Java编程的一些基础知识点,实际考试中可能还会涉及到更深入的理论,如设计模式、并发编程、反射、注解、JVM工作原理等。通过反复练习和实践,才能更好地掌握Java编程技能,并顺利通过考试。

    Java期末复习——枚举与反射机制

    二、反射机制 反射机制允许在运行时检查类的信息,包括类的结构、字段、方法等,并动态创建和访问对象。`java.lang.Class`类是反射的起点,我们可以通过以下三种方式获取`Class`对象: 1. 对象的`getClass()`方法...

    Java复习资料及例题源代码

    Java反射机制允许程序在运行时动态获取类的信息并操作对象,而注解则是提供元数据的一种方式。复习资料会介绍如何使用反射创建、访问类和对象,以及注解的使用和自定义。 九、Java EE相关 如果内容涉及Java企业版,...

    java面试复习资料

    ### Java面试复习资料详解 #### 一、内存泄漏与内存溢出 - **内存泄漏**:指程序在申请内存后,无法释放已分配的内存空间,导致随着时间的推移,程序所消耗的内存逐渐增加。这通常是因为程序员未能正确地管理内存...

    java复习题3

    "Java复习题3"显然聚焦于帮助学习者巩固和深化对Java语言的理解。在这个复习题集中,我们可能会涉及众多Java的基础概念和高级特性。下面将就Java的一些核心知识点进行详细阐述。 1. **基本语法**: Java是一种静态...

    java面试复习资料.pdf

    Java面试复习资料涵盖了众多核心知识点,对于准备Java面试的求职者来说是不可或缺的参考资料。以下是一些关键点的详细解析: 1. **面向对象**:Java是一种面向对象的语言,其三大特性是封装、继承和多态。面试中常...

    java复习.zip

    "java复习.zip"这个压缩包包含了一份全面的Java复习资源,涵盖了Java基础知识、面试笔试题、逻辑题以及各大公司的Java题目,还特别提到了SSH框架,即Struts、Spring和Hibernate这三个流行框架的综合应用。...

    Java基础考试复习资料

    11. **反射机制**:Java反射允许在运行时动态地获取类的信息并操作类的对象,包括Class类的使用、newInstance()、getMethod()、getField()等方法。 12. **泛型**:泛型引入了类型参数的概念,增强了代码的类型安全...

    JAVA课程总复习

    【JAVA课程总复习】 在Java编程领域,复习是巩固学习成果和提升技能的关键步骤。"JAVA课程总复习"涵盖了从基础到高级的各种Java知识点,旨在帮助开发者系统地回顾和理解这个强大而广泛应用的编程语言。 首先,我们...

    java入门复习题对刚刚入门的新手 肯定有用

    以下是一些关键的学习点,这些知识点在"java入门复习题"中可能会涉及到: 1. **基础语法**:了解Java的基本结构,包括类(class)、对象(object)、变量(variable)、常量(constant)以及数据类型(如int、...

    JAVA复习ppt

    9. **反射机制**:Java的反射机制允许程序在运行时动态获取类的信息(如类名、方法名)并调用,增强了程序的灵活性。 10. **垃圾回收**:Java的自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,防止内存...

    北大青鸟 S1 java总复习资料

    6. **反射**: 了解Java反射机制,学习Class类的使用,动态获取类的信息,实例化对象,调用私有方法,以及修改私有变量等。 7. **JDBC数据库操作**: 学习连接数据库、执行SQL语句、处理结果集,理解预编译语句...

    java语言程序设计 进阶版 第十版 复习题答案

    本书《Java语言程序设计 进阶版 第十版》提供的复习题及其答案,旨在帮助读者巩固并深化对Java语言的理解。下面将详细讨论复习题中涉及的一些关键知识点。 1. **面向对象编程**:Java是一种面向对象的语言,复习题...

    Java基础复习

    14. **反射机制**:Java的反射API允许程序在运行时动态访问类、接口、字段和方法的信息,实现动态调用方法,增强了程序的灵活性。 15. **枚举类型**:Java 5引入了枚举,用于表示固定集合的值。枚举类可以拥有方法...

    java程序语言设计第十版复习题答案

    下面,我们将详细探讨Java的一些关键知识点,以及这些复习题可能涵盖的内容。 1. **基础语法**:Java是一种静态类型的面向对象语言,其语法严谨。复习题可能包括变量声明、数据类型(如int、float、char、boolean)...

    java复习资料

    Java是一种广泛使用的面向对象...以上知识点涵盖了Java编程的多个方面,对于准备Java期末考试或二级考试的同学来说,这些都是必须掌握的内容。在复习过程中,结合具体的试题进行实践,将有助于加深理解和提高解题能力。

Global site tag (gtag.js) - Google Analytics