zoukankan      html  css  js  c++  java
  • 初识反射

    反射:

      主要是指程序可以访问,监测,修改他本身状态的能力,并根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语意。

      每一个类通过javac.exe编译之后,会产生一个.class文件,在通过类加载器加载.class文件,此.class文件加载到内存之后就是一个运行时的类,存放在缓存区,这个运行时的类本身就是一个实例,一个运行时类只加载一次。

    public class Person {
        public int age;
        private  String name;
    
        public Person() {
        }
    
        public Person(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        public  void show(){
            System.out.println("我是一个人!");
        }
        private  void  eat(String str){
            System.out.println("我正在吃"+str);
        }
    }
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    /**
     * Created by 东 on 2016/11/5.
     */
    public class TestReflect {
        @Test
        public void test01() {
            //在不应用反射的时候,先获取Person类的对象。但是无法访问private权限的属性和方法。
            Person person = new Person();
            person.setAge(20);
            person.setName("Mr_List");
            System.out.println(person);
            person.show();
        }
    
        @Test
        public void test02() throws Exception {
            //1.使用反射先获取Person类的class。在java中每个类都会有对应的Class对象,
            // 在编译之后的.class文件中都会有对应的Class对象,用来记录这个类的类型信息。
            Class person_clazz = Person.class;
            Person person = (Person) person_clazz.newInstance();
            /**
             * 获取Person类的public属性
             * */
            Field age_field = person_clazz.getField("age");
            age_field.set(person, 20);
            System.out.println(person);
    
            /**
             * 获取Person类的私有属性
             * */
            //1.获取类的私有属性
            Field name_field = person_clazz.getDeclaredField("name");
            //2.设置属性为可以修改状态
            name_field.setAccessible(true);
            //3.设置属性值
            name_field.set(person, "List");
            System.out.println(person);
    
            /*
            * 调用public的方法
            * */
            Method show_method=person_clazz.getMethod("show");
            show_method.invoke(person);
    
            /**
             * 调用private的方法
             */
            Method eat_method=person_clazz.getDeclaredMethod("eat",String.class);
            //设置方法使可以调用和修改的状态
            eat_method.setAccessible(true);
            eat_method.invoke(person,"面包");
         }
    }
    

      

    获取运行时类的Class实例的方法

     1  public void test03() throws ClassNotFoundException {
     2         //1.通过类的.class属性
     3         Class clazz1=Person.class;
     4         System.out.println(clazz1);
     5 
     6         //2.通过类的对象
     7         Person person=new Person();
     8         Class clazz2=person.getClass();
     9         System.out.println(clazz2);
    10 
    11         //通过Class的静态方法
    12         String className="Person";
    13         Class clazz3=Class.forName(className);
    14         System.out.println(clazz3);
    15 
    16         //4.通过类加载器
    17         ClassLoader classLoader=this.getClass().getClassLoader();
    18         Class clazz4=classLoader.loadClass(className);
    19         System.out.println(clazz4);
    20     }

    运行效果:

      

  • 相关阅读:
    Activity跳转动画
    如何查询自己的手机版本?欧版、亚太、港行、还是国行?
    VC程序员常用工具汇总
    陈灯可重用代码段管理器VS插件版5.0发布(代码段收集器、个人代码库、代码片段管理、代码管理)
    基于OSLC的系统集成
    安桌点菜源代码
    eclipse jsp 文字设置
    ubuntu 下 netbeans平台 使用C连接mysql
    使用gdi+实时绘制picturebox(画个叉)
    思路上的转变,运用投影和一阶导数的思想
  • 原文地址:https://www.cnblogs.com/zhuxiaodong/p/6034070.html
Copyright © 2011-2022 走看看