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     }

    运行效果:

      

  • 相关阅读:
    phpstorm+xdebug配置
    php5.4 traits
    psr-4
    oAuth 认证和授权原理
    跨域解决方案
    【微信公众平台开发】利用百度接口,制作一键导航功能
    php 加密压缩
    jquery validate使用笔记
    where和having
    在join中,on和where的区别
  • 原文地址:https://www.cnblogs.com/zhuxiaodong/p/6034070.html
Copyright © 2011-2022 走看看