zoukankan      html  css  js  c++  java
  • java 通过反射获取调用类方法及属性

    首先说下反射是什么?反射是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

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

    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+"
    age="+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);
                    
        }
    
    }
  • 相关阅读:
    一份简单的自我评述
    从诞总那儿得到的一些感悟
    2021秋软件工项目选题
    LeNet 网络进行猫狗大战
    不平行的直线
    切长条
    纪念品分组
    奇♂妙拆分
    Qt 一些日期格式转换不精确
    windbg 查看崩溃日志
  • 原文地址:https://www.cnblogs.com/dacai/p/5249846.html
Copyright © 2011-2022 走看看