什么是反射?
在运行时,当前类的所有属性和方法都可以被其他类看见并调用。这种动态获取对象信息和调用对象方法的方式称为反射机制。
准备目标类:
package reflex;
public class BeReflexed {
public String msg1;
protected String msg2;
private String msg3;
public BeReflexed(String msg1, String msg2, String msg3) {
super();
this.msg1 = msg1;
this.msg2 = msg2;
this.msg3 = msg3;
}
public BeReflexed(String msg1, String msg2) {
super();
this.msg1 = msg1;
this.msg2 = msg2;
}
public BeReflexed() {
super();
}
public void testMethod1() {
}
public void testMethod2(String msg) {
System.out.println(msg);
}
protected void testMethod3() {
System.out.println(msg1);
}
private void testMethod4() {
}
protected void testUse() {
System.out.println("success!");
}
}
通过反射获得类的属性和方法
主要是三个方法:
getDeclaredMethods() 获得类的所有方法
getDeclaredFields() 获得类的所有属性
getDeclaredConstructors() 获得类的所有构造器
package reflex;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class UseReflex {
// 将异常在方法上抛出,自己协商try catch快出了块体无法访问clazz对象
public static void main(String[] args) throws ClassNotFoundException {
Class clazz = Class.forName("reflex.BeReflexed"); // 最常用,推荐使用
// Class a = UseReflex.class; // 通过类名来创建class对象
// Class b = new UseReflex().getClass(); // 通过对象来创建class对象
// Class c = Integer.TYPE; // 包装器类型创建class对象
Method[] method = clazz.getDeclaredMethods();
for (Method m : method) {
System.out.println(m.toString());
}
System.out.println();
Field[] field = clazz.getDeclaredFields();
for(Field f : field) {
System.out.println(f.toString());
}
System.out.println();
Constructor[] constructor = clazz.getDeclaredConstructors();
for(Constructor c : constructor) {
System.out.println(c.toString());
}
}
}
输出:
protected void reflex.BeReflexed.testMethod3()
private void reflex.BeReflexed.testMethod4()
public void reflex.BeReflexed.testMethod2(java.lang.String)
protected void reflex.BeReflexed.testUse()
public void reflex.BeReflexed.testMethod1()
public java.lang.String reflex.BeReflexed.msg1
protected java.lang.String reflex.BeReflexed.msg2
private java.lang.String reflex.BeReflexed.msg3
public reflex.BeReflexed()
public reflex.BeReflexed(java.lang.String,java.lang.String)
public reflex.BeReflexed(java.lang.String,java.lang.String,java.lang.String)
通过反射创建对象有两种方式:
一种是Class对象调用newInstance方法创建对象
另一种通过Constructor类构造有参数的方法创建对象
package reflex;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class UseReflexOfConstructor {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Class clazz = Class.forName("reflex.BeReflexed");
BeReflexed bf = (BeReflexed) clazz.newInstance();
bf.testUse();
Constructor c = clazz.getDeclaredConstructor(String.class,String.class);
BeReflexed bf1 = (BeReflexed) c.newInstance("张三","李四");
bf1.testMethod3();
}
}
结果:
success!
张三