概念:
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取信息以及动态调用对象的方法的功能称为Java的反射机制。
反射主要是指程序可以访问,检测和修改它本身的状态或行为的一种能力。
用途:
在运行时判断任意对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法。
使用Java反射机制一般遵循三步:
1:获取想操作类的Class对象;
2:通过第一步获得的Class对象取得操作类的方法或属性名;
3:操作第二步取得方法或属性。
public class Role {
private String name;
private String type;
public Role(){
}
private Role(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public String getType(){
return type;
}
public void setType(String type){
this.type=type;
}
public String toString(){
return "This is a role called "+this.name;
}
取得操作类的三种方法:
1:调用Class 的forName()静态方法
Class cls=Class.forName("reflection.Role");
//注意forName中的参数一定是完整的类名(包名+类名),且该方法需要捕获异常
2:使用类的class语法
Class cls=Role.class;
3:调用对象的getClass()方法
String str="abc";
Class cls=str.getClass();
获取类的构造器:
Constructor类,用来封装反射得到的构造器
public Constructor>[] getConstructors()//返回类中所有的public构造器集合,默认构造器的下标为0
public Constructor<T> getConstructor(Class>...parameterTypes)//返回指定public构造器,参数为构造器参数类型集合
public Constructor>[] getDeclaredConstructors()//返回类中所有的构造器,包括私有
public Constructor<T> getDeclaredConstructor(Class>... parameterTypes)//返回任意指定的构造器
代码举例:
//制定参数列表获取特定的构造方法
Constructor con=cls.getDeclaredConstructor(String.class);
con.setAccessible(true);
Object obj=con.newInstance("liyang");
//获取所有的构造方法集合
Constructor[] cons=cls.getDeclaredConstructors();
cons[1].setAccessible(true);
Object obj1=cons[1].newInstance("Tom");
Object obj2=cons[0].newInstance();
获取类的成员变量:
Filed类,用来封装反射得到的变量
public Field getDeclaredField(String name)//获取任意指定名字的成员
public Field[] getDeclaredFields()//获取所有的成员变量
public Field getField(String name)//获取任意指定名字的public成员变量
public Field[] getFields()//获取所有的public成员变量
代码举例:
//获取成员变量
Field member=cls.getDeclaredField("name");
member.setAccessible(true);
member.set(obj1, "newTom");
获取类的方法:
Method类,用来封装反射得到的方法
public Method[] getMethods()//获取所有的共有方法的集合
public Method getMethod(String name,Class>... parameterTypes)//获取指定公有方法 参数1:方法名 参数2:参数类型集合
public Method[] getDeclaredMethods()//获取所有的方法
public Method getDeclaredMethod(String name,Class>... parameterTypes)//获取任意指定方法
代码举例:
//调用类的方法
Method m1=cls.getMethod("getName",null);
Object name=m1.invoke(obj1,null);
Method m2=cls2.getMethod("setName",String.class);
m2.invoke(obj1,"newTom2");
样例代码:
import java.lang.reflect.*;
public class Reflect {
public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根
student studentA=new student();
studentA.setStuName("baoxu");
studentA.setStuAge(26);
student studentB=new student();
copyBean(studentA,studentB);
student studentC=(student)copyBean(studentB);
Class> cls=student.class;
Constructor c=cls.getDeclaredConstructor(String.class,int.class);
c.setAccessible(true);
Object studentD=c.newInstance("baoxu",26);
Method staticMethod=cls.getMethod("show",String.class,int.class);
staticMethod.invoke(cls, "baoxu",26);
}
private static void copyBean(Object from,Object to)throws Exception{
Class> fromClass=from.getClass();
Field[] FromFields=fromClass.getDeclaredFields();
Class> toClass=to.getClass();
Field toField=null;
for(Field fromField:FromFields){
String name=fromField.getName();
toField=toClass.getDeclaredField(name);
fromField.setAccessible(true);
toField.setAccessible(true);
toField.set(to, fromField.get(from));
}
}
private static Object copyBean(Object from)throws Exception{
Class> fromClass=from.getClass();
Object copyOne=fromClass.newInstance();
Field[] fromFields=fromClass.getDeclaredFields();
for(Field fromField:fromFields){
fromField.setAccessible(true);
fromField.set(copyOne, fromField.get(from));
}
return copyOne;
}
}
class student{
private String stuName;
private int stuAge;
public student(){
}
private student(String name,int age){
this.stuName=name;
this.stuAge=age;
}
public String getStuName(){
return stuName;
}
public void setStuName(String name){
this.stuName=name;
}
public int getStuAge(){
return stuAge;
}
public void setStuAge(int age){
this.stuAge=age;
}
public String toString(){
return stuName+":"+stuAge;
}
public static void show(String name,int age){
System.out.println("hello,my name is "+name+". I'm "+age+" years old");
}
}