`
lapulande
  • 浏览: 219372 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java 反射机制及其应用

阅读更多

Reflection 是 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) 也是反射....

 

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

 

 

分享到:
评论

相关推荐

    java的反射机制及其实际应用

    ### Java的反射机制及其实际应用 #### 一、引言 Java作为一种强大的编程语言,提供了许多高级特性,其中反射机制尤为突出。通过反射,开发者可以在运行时动态地获取类的信息并操纵类的行为,从而实现更加灵活和...

    java面试题--反射机制

    通过本文,我们将深入探讨Java反射机制的核心概念、基本原理及其应用场景。 #### 二、Java反射机制简介 Java反射机制允许程序在运行时获取类的信息,这使得Java具有了一定程度上的动态性。具体来说,Java反射机制...

    Java反射机制21

    以下是对Java反射机制及其应用的详细说明: 1. **获取Class对象**: - **类名.class**:这是最直接的方式,通过类名后跟`.class`来获取对应的`Class`对象,例如`com.anbai.sec.classloader.TestHelloWorld.class`...

    Java反射机制的实现_Reflection

    Java反射机制还涉及到注解处理,可以使用`Annotation`接口及其子类来获取和处理类、方法、字段上的注解信息。这对于实现元编程、AOP(面向切面编程)和自定义注解处理器非常有用。 总的来说,Java反射机制为程序员...

    Java反射机制学习(二)

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

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

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

    Java中的反射机制

    Java反射机制允许运行中的程序检查自身,并能直接操作程序的内部属性。这是其他许多编程语言(如Pascal、C或C++)不具备的能力。 **1.1 Reflection的工作机制** 为了展示反射如何工作,我们来看一个简单的例子: ...

    java 反射机制

    ### Java反射机制深入理解 #### 一、反射机制概述 Java反射机制是一种强大的工具,它允许程序在运行时检查和操作任何类、方法、构造函数和字段等元素。这种能力对于构建灵活的应用程序和框架非常有用,特别是那些...

    java反射机制知识点【精通JAVA必知必会】

    下面将详细解释Java反射机制及其相关知识点。 首先,我们要明白Java反射的核心概念——在程序运行时动态地获取类的信息和调用类的方法。通常,在编译时,Java程序需要知道所有使用的类,但在反射机制下,程序可以在...

    java反射机制原理

    本文将深入探讨Java反射机制的原理及其在实际开发中的应用。 首先,我们要理解什么是反射。反射是指在运行时,程序能够获取关于类、接口、字段和方法等信息,并且能够动态地调用方法、创建对象的能力。在Java中,`...

    java反射机制,适合初步接触反射机制的人

    ### Java反射机制详解 #### 一、Java反射机制概述 Java反射机制是Java语言中一个重要的特性,它赋予了Java...总之,理解Java反射机制对于开发复杂的应用程序至关重要,尤其是在需要处理动态类型或元数据的情况下。

    JAVA的反射机制与动态代理

    Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在许多实际场景中发挥着关键作用,如框架开发、插件系统、元数据处理等。下面将详细讲解这两个概念及其应用。 首先,Java的反射机制允许我们在...

    JAVA反射机制

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

Global site tag (gtag.js) - Google Analytics