JAVA反射机制是在运行状态中, 对于任意一个类都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
光这样子说可能有点抽象, 我们举个例子来说明一下.
首先我们创建一个Robot类
package com.daohewang.javabasic.reflect;
public class Robot {
private String name;
public void sayHi(String helloSentence){
System.out.println(helloSentence + " " + name);
}
private String throwHello(String tag){
return "Hello " + tag;
}
static {
System.out.println("Hello Robot");
}
}
接下来, 我们利用java的发射机制, 来获取该类中的属性和方法
package com.daohewang.javabasic.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectSample {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException, NoSuchFieldException {
// 获取Robot类
Class rc = Class.forName("com.daohewang.javabasic.reflect.Robot");
// 创建Robot实例
Robot r = (Robot) rc.newInstance();
System.out.println("Class name is " + rc.getName());
// 除了继承和所实现的接口的方法不能获取, 该类其他方法都可以获取
Method getHello = rc.getDeclaredMethod("throwHello", String.class);
getHello.setAccessible(true);
Object str = getHello.invoke(r, "Bob");
System.out.println("getHello result is " + str);
// 只能获取该类public的方法, 但是可以获取继承类的公用方法以及所实现的一些接口的方法
Method sayHi = rc.getMethod("sayHi", String.class);
sayHi.invoke(r, "Welcome");
Field name = rc.getDeclaredField("name");
name.setAccessible(true);
name.set(r, "Alice");
sayHi.invoke(r, "Welcome");
System.out.println(System.getProperty("java.ext.dirs"));
System.out.println(System.getProperty("java.class.path"));
}
}
总的来说, 反射就是把java类中的各个成分映射成一个个的对象