`

Java反射

阅读更多

一、java类反射中所必须的类 FieldConstructorMethodClassObject

Field类:提供有关类或接口的属性的信息。发射的字段可能是类属性或实例属性,可以看成一个封装了反射类的属性的类

Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限

Method类:用类封装反射类方法的一个类

Class类:表示正在运行的java应用程序中的类和接口

Object类:每个类都使用Object作为超类。所有对象包括数组都实现这个类的方法。

 

二、新建一个A类用来表示反射类  继承了Object类,有一个接口是ActionListener,两个属性intInteger,两个构造方法和两个方法

Ajava代码

 

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class A extends Object implements ActionListener {
	private int a = 3;
	public Integer b = new Integer(4);

	public A() {
	}

	public A(int id, String name) {
	}

	public int abc(int id, String name) {
		return 0;
	}

	public void actionPerformed(ActionEvent e) {
	}
}

 

 

Bjava代码

import java.lang.reflect.Field;

public class B {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		A r = new A();
		Class temp = r.getClass();
		try {
			System.out.println("反射类中所有公有的属性");
			Field[] fb = temp.getFields();
			for (int i = 0; i < fb.length; i++) {
				Class cl = fb[i].getType();
				System.out.println("fb:" + cl);
				System.out.println("fb:" + fb[i].get(r));
			}

			System.out.println("反射类中所有的属性");
			Field[] fa = temp.getDeclaredFields();
			for (int i = 0; i < fa.length; i++) {
				Class cl = fa[i].getType();
				System.out.println("fb:" + cl);
			}

			System.out.println("反射类中似有的属性");
			Field aField = temp.getDeclaredField("a");
			aField.setAccessible(true);
			aField.set(r, 6);
			Integer aValue = (Integer) aField.get(r);
			System.out.println("a=" + aValue);
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
}

 

 

 

 

 

 

 

 

这里用了两类方法:getFields()getDeclaredFields(),它们分别是用来获取反射类中所有公有属性和反射类中所有的属性的方法。另外还有getField(String)getDeclaredField(String)方法都是用来获取反射类中指定的属性的方法

这里还用到了Field 类的setAccessible方法,它是用来设置是否有权限访问反射类中的私有属性的,只有设置为true时才可以访问,默认为false。另外 Field类还有set(Object AttributeName,Object value)方法,可以改变指定属性的值。

 

三、如何获取反射类中的构造方法

SampleConstructor.java代码

import java.lang.reflect.Constructor;

public class SampleConstructors {

	public static void main(String[] args) {
		A r = new A();

		Class temp = r.getClass();
		// 获取类的名字
		String stringName = temp.getName();

		Constructor[] theConstructor = temp.getConstructors();
		for (int i = 0; i < theConstructor.length; i++) {
			Class[] paramClass = theConstructor[i].getParameterTypes();
			System.out.print("A(");
			for (int j = 0; j < paramClass.length; j++) {
				System.out.print(paramClass[j].getName() + " ");
			}
			System.out.println(")");
		}
	}
}

 

 

 

 

 

 

 

 

 

getConstructors()方法获取了反射类的构造方法的集合,并用Constructor类的getParameterTypes()获取该构造方法的参数。

 

四、如何获取反射类的父类和接口

SampleInterface.java代码

public class SampleInterface {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		A r = new A();
		Class temp = r.getClass();

		Class[] theInterfaces = temp.getInterfaces();
		for (int i = 0; i < theInterfaces.length; i++) {
			// 获取接口的名字
			System.out.println(theInterfaces[i].getName());
		}
		// 获取父类的名字
		Class theSuperClass = temp.getSuperclass();
		System.out.println(theSuperClass.getName());
	}
} 








 

 

Class类的getInterfaces()方法获取反射类的所有接口,由于接口可以有多个,所以它返回的是数组。用getSuperClass()方法来获取反射类的父类,由于一个类只能继承一个类,所以它返回一个Class对象。

 

五、如何获取反射类的方法

SampleMethod.java代码

import java.lang.reflect.Method;

public class SampleMethod {
	public static void main(String[] args) {
		A r = new A();

		Class temp = r.getClass();
		String className = temp.getName();
		Method[] methods = temp.getMethods();

		for (int i = 0; i < methods.length; i++) {
			// 输出方法的返回类型
			System.out.print(methods[i].getReturnType().getName());
			// 输出方法名
			System.out.print(" " + methods[i].getName() + "(");

			// 获取方法的参数
			Class[] paramTypes = methods[i].getParameterTypes();
			for (int j = 0; j < paramTypes.length; j++) {
				System.out.print(paramTypes[j].getName());
				if (paramTypes.length > j + 1) {
					System.out.print(",");
				}
			}
			System.out.println(")");
		}
	}
}

 

 

 

 

 

 

获取了反射类的所有方法,包括继承自它父类的方法。然后获取方法的返回值、方法名、参数列表。

 

六、下面是一个完整的小例子

LoadMethod.java

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

public class LoadMethod {
	/**
	 * 运行时加载指定的类
	 */
	public Object Load(String cName, String methodName, String[] type,
			String[] param) {
		Object retobj = null;

		try {
			// 加载指定的java类
			Class cls = Class.forName(cName);
			// 获取指定对象的实例
			Constructor ct = cls.getConstructor(null);
			Object obj = ct.newInstance(null);

			// 构建方法参数的数据类型
			Class paramTypes[] = this.getMethodClass(type);

			// 在指定类中获取指定的方法
			Method meth = cls.getMethod(methodName, paramTypes);

			// 构建方法的参数值
			Object arglist[] = this.getMethodObject(type, param);

			// 调用指定的方法并获取返回值为Object类型
			retobj = meth.invoke(obj, arglist);

		} catch (Exception e) {
			System.err.println(e);
		}

		return retobj;
	}

	/**
	 * 获取参数类型Class[]的方法
	 */
	public Class[] getMethodClass(String[] type) {
		Class[] cs = new Class[type.length];
		for (int i = 0; i < cs.length; i++) {
			if (!type[i].trim().equals("") || type[i] != null) {
				if (type[i].equals("int") || type[i].equals("Integer")) {
					cs[i] = Integer.TYPE;
				} else if (type[i].equals("float") || type[i].equals("Float")) {
					cs[i] = Float.TYPE;
				} else if (type[i].equals("double") || type[i].equals("Double")) {
					cs[i] = Double.TYPE;
				} else if (type[i].equals("boolean")
						|| type[i].equals("Boolean")) {
					cs[i] = Boolean.TYPE;
				} else {
					cs[i] = String.class;
				}
			}
		}
		return cs;
	}

	/**
	 * 获取参数Object[]
	 */
	public Object[] getMethodObject(String[] type, String[] param) {
		Object[] os = new Object[type.length];
		for (int i = 0; i < os.length; i++) {
			if (!type[i].trim().equals("") || type[i] != null) {
				if (type[i].equals("int") || type[i].equals("Integer")) {
					os[i] = new Integer(param[i]);
				} else if (type[i].equals("float") || type[i].equals("Float")) {
					os[i] = new Float(param[i]);
				} else if (type[i].equals("double") || type[i].equals("Double")) {
					os[i] = new Double(param[i]);
				} else if (type[i].equals("boolean")
						|| type[i].equals("Boolean")) {
					os[i] = new Boolean(param[i]);
				} else {
					os[i] = String.class;
				}
			}
		}
 		return os;
	}
}

实现Java在运行时加载指定的类,并调用指定方法的一个小例子

 

七、反射有个缺点。就是性能问题。用于字段和方法接入时反射要远慢于直接代码。性能问题的程度取决于程序中是如何使用反射的。如果它作为程序运行中相对很少涉及的部分,缓慢的性能将不会是一个问题。即使测试中最坏情况下的计时图显示的反射操作只耗用几微秒。仅反射在性能关键的应用的核心逻辑中使用时性能问题才变得至关重要。

分享到:
评论

相关推荐

    java反射 java反射 java反射java反射

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...

    java反射,获取所有属性、方法以及List集合类

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...

    JAVA反射机制的入门代码

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

    JAVA 反射机制应用

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...

    java 反射得到某个方法

    在本文中,我们将深入探讨如何使用Java反射来获取并执行某个特定的方法。 首先,我们需要了解Java反射的基本概念。`java.lang.Class`类是反射的核心,它代表了Java中的每一个类。我们可以通过以下方式获取到一个...

    Java反射性能测试分析

    ### Java反射性能测试分析 #### 引言 Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的...

    Java反射机制总结

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

    Java反射经典实例

    Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...

    反射实例-JAVA反射机制

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

    java反射.pdf

    ### Java反射机制详解 #### 一、什么是Java反射? Java反射是Java编程语言的一个特性,它允许运行时检查和操作程序结构(类、字段、方法等)。反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用...

    java 反射 调用私有方法(有参数私有方法)获取私有属性值

    Java反射是Java语言提供的一种强大的动态类型特性,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够动态地创建对象和调用方法。这个能力使得开发者可以突破静态类型的束缚,实现一些在编译时期无法完成...

    java反射源代码

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有高度的灵活性,尤其在处理框架、插件系统以及元数据驱动...

    java 反射机制例子

    ### Java反射机制详解 #### 一、反射的基本概念与历史背景 反射的概念最早由Smith在1982年提出,其核心思想是程序有能力访问、检测甚至修改自身的状态和行为。这种能力一经提出,迅速成为了计算机科学领域的研究...

    java 反射 报错 no such method exception

    ### Java反射机制与NoSuchMethodException详解 在Java编程中,反射是一种强大的机制,允许程序在运行时检查和修改自身结构和行为。然而,当开发者尝试使用反射调用一个不存在的方法时,便会遇到`java.lang....

    java反射获取所有属性,获取所有get方法,包括子类父类

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建动态代理等。...

    利用java反射将json字符串转成对象.zip

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在给定的“利用java反射将json字符串转成对象”的主题中,我们将深入探讨如何借助反射机制将JSON...

    Java反射机制Demo

    ### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...

    北大青鸟java反射机制

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念...

    java反射

    ### Java反射机制详解 #### 一、引言 在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时访问类的信息,并能够动态地创建对象、调用方法以及获取字段值等。这种能力对于框架设计、代码...

Global site tag (gtag.js) - Google Analytics