Java反射知识点总结

概念:
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");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值