美文网首页
利用反射进行常规操作

利用反射进行常规操作

作者: hello_world_cxm | 来源:发表于2021-02-05 21:19 被阅读0次
    package day0204;
    
    import java.lang.reflect.*;
    
    
    public class TestReflection {
        //利用反射实现一些常规操作
        public static void main(String[] args) throws Exception{
            /*
             * 类对象.newInstance() 创建类的对象 但是此种方式在java9后就被弃用了
             * 改用类对象.getDeclaredConstructor().newInstance()
             * 有类对象 也有构造方法对象
             * */
            Class<?> c1 = new Student().getClass();  //获取本类对象
            Object a = c1.getDeclaredConstructor().newInstance();
            Class<?> c = Class.forName("day0204.Student");  //获取到Student类对象 <?>泛型通配符
            //Object o =c.getDeclaredConstructor().newInstance(); //等于Student o = new Student()
            //因为有重载构造方法 所以需要指定参数表 依次来获取对应的构造方法
            Constructor con = c.getDeclaredConstructor(String.class,int.class);
            //获取有参构造方法对象,然后通过newInstance来创建Student对象
            Object o = con.newInstance("liucy",40);  //等于Object o2 = new Student("liucy",40) 调用无参构造方法创建对象
            System.out.println("----------------------------------------类对象调用 无参方法");
            Method m1 = c.getMethod("study");  //获取无参study方法对象 注意这还只是对象而已 还没开始调方法
            m1.invoke(o);  //传入类的对象 类型是Object。等同于o.study()
            System.out.println("----------------------------------------类对象调用 有参方法");
            Method m2 = c1.getMethod("study");  //类对象.getMethod() 返回方法对象
            Method m3 = c1.getMethod("study", String.class,int.class);  //第二个参数 API要求传入参数类型的类对象 比如参数是String 那么该类对象就是String.class String是一个类名
            Object result = m2.invoke(a);  //调用无参方法 可以用Object接受返回内容 如果是void 则可以判断是不是void对象
            System.out.println(result);
            m3.invoke(o,"cc",20);  //调用有参方法 此时调用的时候,记得要给方法传参
        }
    
    }
    class Student{
        String name;
        int age;
        //创建有参构造方法
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
            System.out.println(name+age+"有参构造方法被调用");
        }
        //创建无参构造方法
        public Student() {
            super();
            System.out.println("Student()无参构造方法被调用");
        }
        //有参学习方法
        public int study(String name,int age) {
            System.out.println(name+age+"岁,开始学习");
            return 100;
        }
        //无参构造方法
        public void study() {
            System.out.println("开始学习了");
        }
        
    }
    

    相关文章

      网友评论

          本文标题:利用反射进行常规操作

          本文链接:https://www.haomeiwen.com/subject/yuwgtltx.html