`
uule
  • 浏览: 6349026 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

反射机制的理解及其用途

 
阅读更多

Reflection 是 Java 程序开发语言的重要特征之一,是学习Java必须知识点。

Java反射机制主要提供了以下功能:在运行时构造一个类的对象;判断一个类所具有的成员变量和方法;调用一个对象的方法;生成动态代理。反射最大的应用就是框架

 

Java.lang.Class和Java.lang.reflect包下的API,用于表示或者处理当前JVM中的类,接口和对象。

 

Java反射的主要功能:

   确定一个对象的类
    取出类的modifiers,数据成员,方法,构造器,和超类.
    找出某个接口里定义的常量和方法说明.
    创建一个类实例,这个实例在运行时刻才有名字(运行时间才生成的对象).
    取得和设定对象数据成员的值,如果数据成员名是运行时刻确定的也能做到.
    在运行时刻调用动态对象的方法.
    创建数组,数组大小和类型在运行时刻才确定,也能更改数组成员的值.

 

Class类是Java反射的基础,Class类表示正在运行的java应用程序中的类和接口。Class只有私有的构造函数。Class类在加载类时由Java虚拟机以及调用类加载器中的 defineClass方法自动创建的。只在内存中存在一份加载类的Class类。
三种方式得到某个Java类的Class类,以java.lang.String为例:

String s = "aaa";
  Class cls1 = s.getClass();
  Class cls2 = String.class;
  Class cls3 = Class.forName("java.lang.String");
  if (cls1 == cls2) {
   System.out.println("cls1 == cls2");
  }
  if (cls2 == cls3) {
   System.out.println("cls2 == cls3");
  } 

 

为什么他们三个会==呢?因为他们描述的都是同一个类java.lang.String类。

Class类还有很多方法,配合java.lang.reflect包下的一些API可以实现更多的功能。

 

一个javabean

package org.legend.reflect;
public class UserInfo {
	private String userName;
	private Integer age;
	public String school;

	public UserInfo() {
	}
	public UserInfo(String name, Integer age, String shool) {
		this.userName = name;
		this.age = age;
		this.school = shool;
	}
	public UserInfo(String name, Integer age) {
		this.userName = name;
		this.age = age;
	}
	public String getInfo(String n, Integer i) {
		return "success" + n + i;
	}
	public void getMyInfo(String mName, String mBirth, Integer age) {
		System.out.println("我是一个来自" + mBirth + "的名叫:" + mName + "的" + age
				+ "岁的选手");
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
}

 

一个操作类:

package org.legend.reflect;

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

/**
 * 反射操作类
 */
public class GetMyInfo {
	
	public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		
		Class mclass = Class.forName("org.legend.reflect.UserInfo");
		System.out.println("------------输出类名-----------------------");
		System.out.println(mclass.getName());        
		System.out.println(mclass.getSimpleName()); //基础类的简称
		
		//获取属性(字段)
		System.out.println("------------输出所有属性--------------------");
		Field[] fileds=mclass.getDeclaredFields();  //得到所有的字段,包括公共,保护,默认(包)和私有变量,但不包括继承的字段。
		    //Field[] fileds = mclass.getFields();      //得到所有的公共字段。
		for(Field field:fileds)
		{
			String fieldName = field.getName();    //属性名称
			int fieldFangWen = field.getModifiers(); //属性访问权限修饰符
			Class fieldType = field.getType();     //属性类型
			System.out.println(Modifier.toString(fieldFangWen)+" "+fieldType.getSimpleName()+" "+fieldName);
		}
		
		//获取方法
		System.out.println("------------输出所有方法--------------------");
		Method [] methods=mclass.getDeclaredMethods();
		     //Method[] medthods = mclass.getMethods();
		for(Method method:methods)
		{
			String methodName = method.getName();      //方法名称
			int methodFangWen = method.getModifiers(); //访问修饰符
			Class methodRetrunType = method.getReturnType();//返回类型
			Class [] methodParameter = method.getParameterTypes();//方法的参数列表
			System.out.print(Modifier.toString(methodFangWen)+" "+methodRetrunType.getSimpleName()+" "+methodName+"(");
			for(int k=0;k<methodParameter.length;k++)
			{	
				String parameterName=methodParameter[k].getSimpleName();
				if(k!=methodParameter.length-1)
				{
					System.out.print(parameterName+" arg"+k+",");
				}
				else
				System.out.print(parameterName+" arg"+k);
			}
			System.out.println(");");
			
		}
		
		//获取构造
		System.out.println("------------输出所有构造器--------------------");
		Constructor[]constructors = mclass.getConstructors();
		for(Constructor constructor:constructors)
		{
			String constructorName = constructor.getName();
			Class[] constructorParameter = constructor.getParameterTypes();
			System.out.print(mclass.getSimpleName()+" "+constructorName.substring(constructorName.lastIndexOf(".")+1, constructorName.length())+"(");
			for(int h=0;h<constructorParameter.length;h++)
			{
				String parameterName = constructorParameter[h].getSimpleName();
				if(h!=constructorParameter.length-1)
					System.out.print(parameterName+" arg"+h+",");
				else
					System.out.print(parameterName+" arg"+h);
			}
			System.out.println(");");

		}
		
		//如何执行指定的方法
		System.out.println("------------反射执行方法--------------------");
		String name ="getMyInfo";
		Class[] parameterTypes = new Class[3];
		parameterTypes[0]= String.class;
		parameterTypes[1]= String.class;
		parameterTypes[2]= Integer.class;
		
		Method me = mclass.getDeclaredMethod(name, parameterTypes);
		Object obj = mclass.newInstance();
		Object[] arg = new Object[3];
		arg[0]="范晶晶";
		arg[1]="AAA风景区";
		arg[2]=new Integer(18);
		me.invoke(obj, arg);
		
	}
	
}

 

反射的应用很多,很多框架都有用到

spring 的 ioc/di 也是反射....
javaBean和jsp之间调用也是反射....
struts的 FormBean 和页面之间...也是通过反射调用....
JDBC 的 classForName()也是反射.....
hibernate的 find(Class clazz) 也是反射....

 

反射还有一个不得不说的问题,就是性能问题,大量使用反射系统性能大打折扣。怎么使用使你的系统达到最优就看你系统架构和综合使用问题啦,这里就不多说了。。。

 

http://www.4ucode.com/Study/Topic/630405

 

 

 

 

 

分享到:
评论

相关推荐

    关于Java的反射机制,你需要理解这些共5页.pdf.zi

    下面将详细阐述Java反射机制的基本概念、用途及其实现方式。 1. **基本概念**: - **类的Class对象**:每个Java类都有一个对应的Class对象,它包含了类的所有信息,如类名、方法、属性等。通过`Class.forName()`...

    JAVA反射机制

    ### JAVA反射机制详解 #### 一、JAVA反射机制概述 **反射**是在1982年由Smith首次提出的概念,指的是程序有能力访问、检测并修改其自身的状态或行为。这一概念一经提出,便迅速引起了计算机科学领域的关注,并在多...

    Java反射_Spring IOC

    Java反射机制是Java语言的一项强大功能,允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。它提供了在运行时访问类、接口、字段和方法的能力,即使这些信息在编译时未知。通过Class对象,我们...

    C#反射.zip

    下面将详细阐述C#反射的基本概念、用途及其相关知识点。 一、什么是C#反射 C#反射是一种动态类型处理能力,它可以在运行时获取类、接口、结构、枚举等类型的信息,包括它们的成员(如字段、属性、方法和事件)以及...

    C# 反射技术应用

    反射是.NET框架的核心机制之一,它允许程序在运行时动态地获取类型信息并调用类型的方法或属性。这为开发人员提供了极大的灵活性,尤其是在处理未知类型的对象时。本文将深入探讨C#中的反射技术及其应用场景。 ####...

    注解与反射-狂神说Java学习笔记

    Java反射机制允许我们在运行时检查类、接口、字段和方法的信息,甚至可以动态创建对象并调用方法。通过`java.lang.Class`类,我们可以获取任何类型的类对象,进而获取其构造器、方法和字段。反射的一个常见用途是在...

    C# 反射 Reflection

    下面我们将深入探讨C#反射的核心概念、主要用途及其在实际开发中的应用。 一、反射基础 1. 类型信息:反射提供了一种方式来获取关于类、接口、结构、枚举等类型的信息。`Type`类是反射的核心,代表任何.NET类型。...

    细细品味C#(抽象接口委托反射)(转自博客园)

    本文系统地介绍了C#中的抽象类、接口、委托和反射的概念及其应用。通过这些基础知识的学习,可以帮助开发者更好地理解和应用面向对象编程中的核心概念和技术。此外,还探讨了抽象类与接口之间的区别,以及如何在实际...

    Java面试题详细(校招版)

    1. 反射:理解反射机制,知道如何通过Class类获取类信息,创建对象,调用方法。 2. 注解:理解注解的用途,知道如何自定义注解和使用元注解。 七、Java集合框架的高级部分 1. 高级集合:理解TreeSet、TreeMap的...

    C#反射学习文档

    ### C#反射学习文档:深入理解同步与异步方法调用 #### 概述 本文档旨在介绍C#中同步与异步方法调用的基本概念及其应用方式,这对于理解和掌握.NET框架下的多线程编程非常关键。同步和异步方法的选择直接影响到...

    2018最新版Java程序员面试宝典+题库

    - 反射:理解反射机制,能在运行时动态获取类信息并调用方法。 3. **集合框架** - List、Set、Queue:理解各种接口如ArrayList、LinkedList、HashSet、TreeSet等的特点和使用场景。 - Map:熟悉HashMap、TreeMap...

    java面试题

    - 反射机制:理解反射的用途,能够动态获取类信息,创建对象并调用方法。 - 注解(Annotation):知道注解的元注解、自定义注解及其使用场景。 6. **输入输出流(IO)与NIO** - 文件操作:掌握File类的使用,...

    java笔试认真学习

    1. 反射:理解反射机制,如何在运行时获取类的信息并进行操作。 2. 动态代理:了解动态代理的概念,以及Java动态代理API的使用。 通过这些基础知识的学习和深入理解,不仅能够应对Java笔试,还能为日常开发工作打下...

    Java笔试(超经典)时可能出现问题及其答案

    12. **反射**:Java反射机制允许在运行时动态访问类的信息,如创建对象、调用方法、修改字段等。虽然在笔试中较少直接考查,但了解其原理和应用,能提升解题的灵活性。 13. **设计模式**:常见的设计模式如单例、...

    JAVA开发面试笔试题汇总_哈哈_

    - 反射:理解Class类,如何通过反射动态调用方法、创建对象和访问字段。 - 注解:了解注解的使用,自定义注解及其处理器。 8. **设计模式** - 常见设计模式:熟悉单例、工厂、观察者、装饰器、代理等设计模式的...

    java web 面试集

    - 反射:理解反射机制,如何动态获取和调用类、方法、字段。 3. **Java Web基础** - Servlet:学习Servlet生命周期,请求响应流程,以及过滤器和监听器的使用。 - JSP:理解JSP脚本元素,EL表达式,JSTL标签库的...

    微波电路及其PCB设计

    - 未能正确理解软件的容错机制,这可能导致设计过程中出现不合理甚至是错误的参数设置。 4. **解决方案**: - 在设计过程中应遵循射频电路设计的基本原则,例如正确处理分布参数效应、合理选择元件布局等。 - ...

    行业文档-设计装置-一种建筑隔热涂料及其制备方法.zip

    它的工作机制在于,涂层中的特殊添加剂如颜料、填料和反射材料可以吸收、散射和反射太阳的红外辐射,减少热量进入建筑物。同时,良好的热绝缘性能可限制热量通过涂层进行传导。此外,涂料的低导热系数有助于防止热量...

    java笔试题

    Java笔试题常常涵盖众多知识点,包括但不限于基础语法、面向对象编程、集合框架、多线程、异常处理、IO流、网络编程、反射机制、设计模式等。以下将针对这些常见领域进行详细的阐述。 1. **基础语法**:这是Java...

    java,c#各种难点

    理解这个过程及其潜在的性能影响是重要的。 - 多态与虚方法:C#的多态性和虚方法实现动态绑定,需要理解这些概念以及何时使用override和new关键字。 3. 两者共有的难点: - 都有丰富的库和框架,如Java的Spring和...

Global site tag (gtag.js) - Google Analytics