Java反射知识点总结

来源:互联网 发布:淘宝号信誉度查询 编辑:程序博客网 时间:2024/05/16 10:45

概念:
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构造器集合,默认构造器的下标为0public 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");    }}
0 0