概述
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
总而言之,反射就是把java类中的各种成分映射成一个个的Java对象。
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
反射的使用
先写一个类
package demo;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.xml.ws.spi.Invoker;
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void study(){
System.out.println("没有参数!");
}
public void say(String methodstr,User user) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Method method=this.getClass().getDeclaredMethod("say" + methodstr, new Class[]{String.class,int.class});
method.invoke(this,new Object[]{user.getName(),user.getAge()});
}
public void sayhello(String name,int age){
System.out.println(name+"今年"+age+"岁");
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public User() {
}
}
测试
package demo;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class TestDemo {
public static void main(String[] args) {
User user=new User("张辉",21);
//获取Class对象的三种方式
Class class1=user.getClass();
Class class2=User.class;
System.out.println(class1==class2);
try {
Class class3=Class.forName("demo.User");
System.out.println(class2==class3);
Field fields[]=user.getClass().getDeclaredFields();
AccessibleObject.setAccessible(fields,true);//修改整个数组的权限
fields[1].set(user,100);
fields[0].set(user,"李四");
user.say("hello",user);
Method method=user.getClass().getDeclaredMethod("study");
method.invoke(user);
for(Field f:fields){
System.out.println(Modifier.toString(f.getModifiers())+","+f.getName()+","+f.getType());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
true
true
李四今年100岁
没有参数!
private,name,class java.lang.String
private,age,int