java 通过反射获取调用类方法及属性

筅森魡賤 提交于 2019-12-10 20:43:10

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

首先说下反射是什么?反射是Sun公司推出的一组API,此组API位于Java.lang.reflect中

反射的作用是编写工具(例如eclipse),编写框架,当然对于一般的程序,我们不可能用反射来做这些事,一般反射大多是用于在构建类的实例以及调用类方法及属性。

ok! 了解了反射是什么以及反射的应用领域,那么就来看看Java中是怎么实现反射的吧

 Student类

public class Student {    public String name;    public String gender;    public int age;    
    public Student(){
        
    }

}

使用反射获取类的实例

public class Test {    public static void main(String[] args)throws ReflectiveOperationException {        //通过三种方式获取类的类对象
        Class<?> c=Student.class;
        Class<?> c1=new Student().getClass();
        Class<?> c2=Class.forName("Student");//通过包名.类名获取类对象(因为该类在default包,所以可以不写包名)        //通过类对象来构建student实例,效果和new  Student()一样,要求Student中必须要有无参的构造函数
        Student s=(Student) c.newInstance();
        Student s1=(Student) c1.newInstance();
        Student s2=(Student) c2.newInstance();
        
        
        s.age=1;
        s1.age=2;
        s2.age=3;
        
        
        System.out.println(s.age);
        System.out.println(s1.age);
        System.out.println(s2.age);
    }

可以看到,正确的输出了1,2,3

技术分享

通过反射获取类的属性及方法,动态执行

 下载地址  最流行的java后台框架 springmvc mybaits 

Student类型

public class Student {    public String name;    private int age;//该属性为私有,可以通过反射获取得到
    
    public Student(){
        
    }    
    public int add(int a,int b){        return a+b;
    }
    
    @Override    public String toString() {        // TODO Auto-generated method stub
        return "name="+name+"\nage="+age;
    }

}

 

动态的给类的属性赋值和调用类的方法

public class Test {    public static void main(String[] args)throws ReflectiveOperationException {        //获取类对象
        Class<?> c=Class.forName("Student");        
        //获取类的属性对象,需要填写属性对象的名称
        Field f1=c.getField("name");//只能获取public的对象
        Field f2=c.getDeclaredField("age");//可以获取到private的对象,这很吊吧        
        
        f2.setAccessible(true);//如果属性是私有的,那么就需要设置可访问
        Student s1=(Student) c.newInstance();        //为属性对象赋值
        f1.set(s1, "张三");
        f2.set(s1, 22);
        
        System.out.println(s1.toString());        
        //通过类对象获取类的方法
        Method m1=c.getMethod("add", int.class,int.class);        
        //动态的执行方法
        int sum=(int) m1.invoke(s1, 1,2);
        System.out.println(sum);
                
    }

}

 

java 通过反射获取调用类方法及属性

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!