1、什么是反射
JAVA反射机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
2、反射的作用
反射可以实现动态代理和IoC模式,具体参考相应的文章介绍
http://blog.csdn.net/pingnanlee/article/details/9123573
http://blog.csdn.net/pingnanlee/article/details/9419149
3、反射的基本方法
package com.basic.reflection;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class BasicReflectionTest {
private String arg;
private int index;
public BasicReflectionTest() {
System.out.println("construct function");
}
public BasicReflectionTest(String arg) {
System.out.println("construct function " + arg);
this.arg = arg;
}
public BasicReflectionTest(String arg, int index) {
System.out.println("construct function " + arg);
this.arg = arg;
this.index = index;
}
public static void main(String argv[]) {
try {
String name = "test";
Class<?> clsTest1 = name.getClass();
System.out.println(clsTest1.getName() + " " + clsTest1.getSuperclass().getName());
Class<?> clsTest2 = Class.forName("java.awt.Button");
System.out.println(clsTest2.getName());
Class<?> clsTest3 = BasicReflectionTest.class;
System.out.println(clsTest3.getName());
} catch(Exception e) {
e.printStackTrace();
}
try {
Class<?> clsTest4 = Class.forName("com.basic.reflection.BasicReflectionTest");
Field field[] = clsTest4.getDeclaredFields();
for (int i = 0; i < field.length; i++) {
System.out.println(Modifier.toString(field[i].getModifiers()) + " " + field[i].getType() + " " + field[i].getName());
}
Method ms[] = clsTest4.getDeclaredMethods();
for (int i = 0; i < ms.length; i++) {
System.out.println(ms[i]);
}
Constructor<?> cons[] = clsTest4.getConstructors();
for (int i = 0; i < cons.length; i++) {
System.out.println(cons[i]);
}
Class<?> inters[] = clsTest4.getInterfaces();
for (int i = 0; i < inters.length; i++) {
System.out.println(inters[i]);
}
Class<?> paras[] = ms[2].getParameterTypes();
for (int i = 0; i < paras.length; i++) {
System.out.println(paras[i]);
}
Class<?> exec[] = ms[2].getExceptionTypes();
for (int i = 0; i < exec.length; i++) {
System.out.println(exec[i]);
}
} catch (Exception e) {
e.printStackTrace();
}
try {
Class<?> t = BasicReflectionTest.class;
BasicReflectionTest test = null;
Object obj = t.newInstance();
test = (BasicReflectionTest)obj;
test.test1();
Method mtest1 = t.getMethod("test1");
mtest1.invoke(obj);
Method mtest2 = t.getMethod("test2", int.class);
mtest2.invoke(obj, 10);
} catch (Exception e) {
e.printStackTrace();
}
}
public void test1() {
System.out.println("print test1");
}
public void test2(int i) throws IOException{
System.out.println("print test2 " + i);
}
public String getArg() {
return arg;
}
public void setArg(String arg) {
this.arg = arg;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}