Java反射中常用的操作方法

原创
2013/03/31 07:05
阅读数 590

一、在JDK中,主要由以下来实现Java反射机制,这些类都位于java.lang.reflect包中:

Class类: 代表一个类;

Field类: 代表类的成员变量;

Method类: 代表类的方法;

Constructor类: 代表类的构造方法;

Array类:提供了动态创建数组,以及访问数组元素的静态方法。

二、以下以代码进行解释:

1) Java语言提供一种直接获得Class实例的简便快捷方式(当使用此技术时,装入类涉及的所有工作都在内部进行):


Class clazz = MyClass.class;


但是,如果需要在运行时从某些外部源读取类名时,就需要使用一个类装入器来查找类信息,此时需要使用下面的方法:


String name = "MyClass";
Class clazz = null;
try {
     clazz = Class.forName(name);
} catch (ClassNotFoundException e) {
     e.printStackTrace();
}

2)如何使用Constructor、Field、及Method:

package com.test.reflect;

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

public class MyClass {
	private String str1;
	private String str2;
	
	public MyClass(String s1, String s2) {
		str1 = s1;
		str1 = s2;
	}
	
	public String sayHello(String name) {
		return "Hello " + name ;
	}
	
	public static void main(String[] args) {
		try {
			//创建类的对象
			Class[] types = new Class[] {String.class, String.class};
			Constructor<MyClass> cons = MyClass.class.getConstructor(types);
			Object[] objs = new Object[] {"a", "b"};
			MyClass clazz =(MyClass) cons.newInstance(objs);
			System.out.println(clazz.toString());
			//创建类的方法
			
			//创建类的字段(获得Class的字段信息不同于构造函数的调用,在参数类型数组中使用了字段名)
			Field field = MyClass.class.getDeclaredField("str1");
			//操作类的字段
			field.set(clazz, "xxx");
			System.out.println(field.get(clazz));
			
			//创建类的方法(获得Class的方法信息与用于构造函数和字段的调用非常类似)
			Class[] types2 = new Class[] {String.class};
			Method method = MyClass.class.getMethod("sayHello", types2);
			//调用方法
			Object[] strs = new Object[] {"World"};
			Object result = method.invoke(clazz, strs);
			System.out.println(result.toString());
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		}
	}

	public String getStr1() {
		return str1;
	}

	public void setStr1(String str1) {
		this.str1 = str1;
	}

	public String getStr2() {
		return str2;
	}

	public void setStr2(String str2) {
		this.str2 = str2;
	}
}


展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
21 收藏
0
分享
返回顶部
顶部