zoukankan      html  css  js  c++  java
  • java中反射的基本使用

    fanShe.java

    package example5;
    class fanShe{
        /*1.应用在一些通用性比较高的代码中。
         *2.后面学的框架,大多数都是应用框架来实现的。
         *3.在框架开发中,都是基于配置文件来开发。在配置文件中配置了类,可以通过反射得到类中的所有内容,可以让类中的某个方法来执行。
         *类中的所有内容:属性,没有参数的构造方法,有参数的构造方法,普通方法。
         *反射的原理:
         *代码保存在.java文件中保存至本地硬盘-->编译得到.class文件-->把class类使用jvm中的类加载器加载至内存-->Class类(字节码文件在内存中的表示)
         *我如果得到了这个Class类,便可以得到类里所有的内容
         *使用反射首先需要得到Class类(三种方法)
         *(1)类名.class
         *(2)对象名.getClass()
         *(3)使用Class.forName("类的路径")
         *属性通过一个类Field获得。
         *构造方法通过一个类constructor获得。
         *普通方法通过一个类method获得。
         */
         private String name;
        int age;
        //无参数的构造方法
        public fanShe() {}
        //有参数的构造方法
        public fanShe(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }  
    }

    testFanshe.java

    package example5;

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;

    import org.junit.Test;

    class testFanshe {
        public static void main(String[] args) throws Exception {
            // 得到Class类的三种方法
            Class c1 = fanShe.class;
            Class c2 = new fanShe().getClass();
            Class c3 = Class.forName("example5.fanShe");
            /*test1();
            test2();
            test3();*/
            test4();
        }

        // 反射操作无参数的构造方法
        public static void test1() throws Exception {
            Class c3 = Class.forName("example5.fanShe");
            // 得到反射类的一个实例
            fanShe f1 = (fanShe) c3.newInstance();
            // 用实例去调用类中的方法
            f1.setName("宝娟");
            System.out.println(f1.getName());
        }

        // 反射操作有参数的构造方法
        @Test
        public static void test2() throws Exception {
            // 得到Class类
            Class c3 = Class.forName("example5.fanShe");
            // 得到有参数的构造方法类
            // 传递的是有参数的构造方法里的参数类型,以class类型传递
            Constructor con = c3.getConstructor(String.class, int.class);
            // 通过有参的构造方法设置实例的值
            fanShe p1 = (fanShe) con.newInstance("阿苏", 20);
            System.out.println(p1.getName() + "  " + p1.getAge());
        }

        // 反射操作类的属性
        public static void test3() {
            // 得到Class类
            try {
                Class c2 = Class.forName("example5.fanShe");
                // 得到类的一个实例
                fanShe p2 = (fanShe) c2.newInstance();
                // 得到name属性,参数是属性名称
                Field f1 = c2.getDeclaredField("name");
                //表示允许操作私有属性
                f1.setAccessible(true);
                //为name属性设置值,第一个参数是类的一个实例,第二个参数是要设置的值。
                f1.set(p2, "wangwu");
                // 得到属性值并打印输出
                System.out.println(f1.get(p2));
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
        //使用反射来操作普通方法
        public static void test4() throws Exception {
            //得到Class类
             Class c4=Class.forName("example5.fanShe");
             //得到类的一个实例
             fanShe p4=(fanShe) c4.newInstance();
            //得到普通方法的类的方法,第一个参数是要操作的普通方法的名称,第二个参数是普通方法中传入参数的类型。
             Method f4=c4.getDeclaredMethod("setAge", int.class);
             //操作的是私有方法
             f4.setAccessible(true);
             //此函数是使普通方法运行,并设置值。第一个参数是类的一个实例,第二个参数是要设置的值。
             f4.invoke(p4,15);
             //将设置的值打印输出
             System.out.println(p4.getAge());
        }
        /*注:当操作的方法是静态方法是,由于静态方法的调用方式是 类名.方法名
         * 所以不需要类的实例
         * 在invoke()方法中的第一个参数直接写为null
         * f4.invoke(null,15);
         */
    }

  • 相关阅读:
    .net core 获取程序中文件路径
    关于autofac的一些具体的用法
    Ztree节点增加删除修改和Icheck的用法
    C# 多线程之Task(任务
    C#开启异步 线程的四种方式
    c# thread数线程的创建
    图片转二进制 ,
    循环中如果有某一次循环抛出异常了整个循环就停止的解决办法
    JAVA 8 Optional的使用
    react 获取指定表单对象中的对象的值
  • 原文地址:https://www.cnblogs.com/aasu/p/9192755.html
Copyright © 2011-2022 走看看