美文网首页
Java反射

Java反射

作者: 磊_5d71 | 来源:发表于2018-10-06 17:04 被阅读0次
    图片.png

    反射常用对象概述

    • Class
      Class类的实例表示正在运行的Java应用程序中的类和接口
    • Constructor
      关于类的单个构造方法的信息以及对它的访问权限
    • Field
      Field提供有关类或接口的单个字段的信息,以及对它的动态访问权限。(类中的属性)
    • Method
      Method提供关于类或接口上单独的方法信息。(类中的方法)


      图片.png

    Class类

    图片.png
    package com.alan.reflect;
    
    import com.alan.entity.Person;
    import org.junit.Test;
    
    public class ClassTest {
    
        @Test
        /**
         * 获得Class对象
         * 1、类名.class
         * 2、对象.getClass()
         * 3、Class.forName()
         */
        public void demo1() throws ClassNotFoundException {
            //1、类名.class
            Class<Person> class1 = Person.class;
            //2、对象.getClass()
            Person person = new Person();
            Class<? extends Person> class2 = person.getClass();
            //3、Class.forName() 通常采用这种方式获得
            Class<?> class3 = Class.forName("com.alan.entity.Person");
        }
    }
    

    Constructor类

    图片.png
    package com.alan.reflect;
    
    import com.alan.entity.Person;
    import org.junit.Test;
    
    import java.lang.reflect.Constructor;
    
    /**
     * 获得Constructor对象
     */
    public class ConstructorTest {
    
        @Test
        /**
         * 获得无参构造
         */
        public void demo1() throws Exception {
            //获得类的字节码文件对应的对象
            Class class1 = Class.forName("com.alan.entity.Person");
            //获得无参构造方法
            Constructor constructor = class1.getConstructor();
            //通过构造器来实例化一个对象
            Person person = (Person) constructor.newInstance(); //相当于 Person person = new Person();
            person.eat();
        }
    
        @Test
        /**
         * 获得有参构造,并实例化
         */
        public void demo2() throws Exception{
            //获得类的字节码文件对应的对象
            Class class1 = Class.forName("com.alan.entity.Person");
            //获得有参构造
            Constructor constructor = class1.getConstructor(String.class, String.class);
            //通过带参构造器实例化对象
            Person person = (Person) constructor.newInstance("alan", "male");//相当于 Person person = new Person("alan","male");
            System.out.println(person);
        }
    }
    

    Field类

    图片.png
    package com.alan.reflect;
    
    import com.alan.entity.Person;
    import org.junit.Test;
    
    import java.lang.reflect.Field;
    
    public class FiledTest {
    
        @Test
        /**
         * 测试公有属性,一般没有必要反射,直接可以通过对象获取
         */
        public void demo() throws Exception {
    
            //获得类字节码文件对应的对象
            Class<?> class1 = Class.forName("com.alan.entity.Person");
            //获得属性值
            Field name = class1.getField("name");
            //操作属性,JDK9以后建议使用新方法class1.getDeclaredConstructor().newInstance()
            Person person = (Person) class1.getDeclaredConstructor().newInstance();
            name.set(person,"你好啊");  //相当于 person.name = "你好啊"
            System.out.println(name.get(person));
    
        }
    
    
        @Test
        /**
         * 测试私有属性
         */
        public void demo2() throws Exception {
            //获得类字节码文件对应的对象
            Class class1 = Class.forName("com.alan.entity.Person");
            //获得属性值
            Field name = class1.getDeclaredField("name");
            //给私有属性赋值
            Person person = (Person) class1.getDeclaredConstructor().newInstance();
            //设置私有属性可访问权限
            name.setAccessible(true);
            name.set(person,"小二郎");
            //打印输出
            System.out.println(name.get(person));
        }
    }
    

    Method类

    图片.png
    package com.alan.reflect;
    
    import com.alan.entity.Person;
    import org.junit.Test;
    
    import java.lang.reflect.Method;
    
    public class MethodTest {
    
        @Test
        /**
         * 测试公有方法
         */
        public void demo1() throws Exception {
    
            Class<?> class1 = Class.forName("com.alan.entity.Person");
            //实例化
            Person person = (Person) class1.getDeclaredConstructor().newInstance();
            //获得公有方法
            Method method = class1.getMethod("eat");
            //执行方法
            method.invoke(person); //相当于person.eat();
    
    
        }
    
        @Test
        /**
         * 测试私有方法
         */
        public void demo2() throws Exception {
    
            Class<?> class1 = Class.forName("com.alan.entity.Person");
            //实例化
            Person person = (Person) class1.getDeclaredConstructor().newInstance();
            //获得私有方法
            Method method = class1.getDeclaredMethod("run");
            //设置私有方法访问权限
            method.setAccessible(true);
            //执行方法
            method.invoke(person);
    
    
        }
    
        @Test
        /**
         * 测试带参私有方法
         */
        public void demo3() throws Exception {
    
            Class<?> class1 = Class.forName("com.alan.entity.Person");
            //实例化
            Person person = (Person) class1.getDeclaredConstructor().newInstance();
            //获得私有方法
            Method method = class1.getDeclaredMethod("sayHello", String.class);
            //设置私有方法访问权限
            method.setAccessible(true);
            //执行方法
            String str = (String) method.invoke(person, "小鄂鄂");
            System.out.println(str);
    
        }
    
    }
    

    相关文章

      网友评论

          本文标题:Java反射

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