• java反射笔记


    反射***

           应用在一些通用性比较高的代码中

           后面的学到的框架,大多数都是用使用反射来实现(面试题)

    菜鸟与骨灰级区别   代码的命名方式   ; debug调试  ;对反射的理解程度

          

    在框架开发中,都是基于配置文件开发的

           再配置文件中配置配置了类,可以通过反射得到类中的 所有内容 ,可以让类中的某个方法来执行

    类中的所有内容  属性  没有参数的构造方法  有参数的构造方法、普通方法

    画图分析反射原理

           首先把java文件保存到本地硬盘

           编译  成class文件

           使用jvm 把class 文件通过类加载器加载到内存中

           万事万物皆对象  class文件在内存中使用class类表示

           当使用反射的时候 首先获取到class类 得到这个类之后,就可以 得到class文件的所有内容

    -       包含属性 构造方法 普通方法

    属性通过一个类  Filed

    构造方法 通过一个类  Constructor

    普通方法 通过一个类 Method

    16使用反射操作类里面的属性

      首先获取到class类

    //获取Class类  三种方式

           

            Class class1 = Person.class;
    
            Class class2 = new Person().getClass();
    
            Class class3 = Class.forName("cn.itcast.test09.Person");

    比如  要对一个类进行实例化 可以用new  不使用new 怎么获取  ?

    //得到Class

           

     Class c3 = Class.forName("cn.itcast.test09.Person");

            //得到Person类的实例

         

       Person p = (Person) c3.newInstance();

     Person类

    package cn.itcast.test09;
    
    public class Person {
        //属性
        private String name;
        private String id;
        //没有参数的构造方法
        public Person(){}
        //有参数的构造方法
        public Person(String name, String id) {
            super();
            this.name = name;
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        
    
    }
    //使用泛型操作普通方法  setName
        //使用Method类表示普通方法
        @Test
        public void test4() throws Exception {
            //得到Class类
            Class c4 = Class.forName("cn.itcast.test09.Person");
            //得到Person实例
            Person p4 = (Person) c4.newInstance();
            //得到普通的方法
            //c4.getDeclaredMethods();//得到所有的普通方法   用的很少
            //下面方法解析  传递两个参数,第一个参数,方法名称;第二个参数 ,通过方法设置的值
            Method m1 = c4.getDeclaredMethod("setName",String.class);
            //若操作的是私有方法,需要来设置值为true    m1.seAccessible(true);
            
            //让setName方法执行 ,执行设置值
            //invoke(p4,"niuqi")  传递两个参数  第一个参数  Person的一个实例,第二个参数,设置的值
            m1.invoke(p4, "niuqi");
            System.out.println(p4.getName());
            
            //当操作的方法是静态方法的时候,因为静态方法调用的方式是  类名,不需要类的实例
            //使用反射操作静态方式的时候,也是不需要实例   m1.invoke(null,"niuqi")
        }
    //操作name属性
    @Test
    public void test3(){
    try{
    //得到class类
    Class c2 = Class.forName("cn.itcast.test09.Person");
    //得到name属性
    
    Person p11 = (Person) c2.newInstance();
    //c2.getDeclaredFields();//表示得到所有的属性//用的很少 了解就行
    Field f1 = c2.getDeclaredField("name");
    
    //设置可以操作私有的属性 
    f1.setAccessible(true);
    //设置name值
    f1.set(p11,"wangwu"); //相当于 p.name = "wangwu";
    System.out.println(f1.get(p11)); //相当于p.name
    
    }catch (Exception e) {
    e.printStackTrace();
    }
    }
    

      

    //操作有参数的构造方法
    @Test
    public void test2() throws Exception{
    //得到Class
    Class c1 = Class.forName("cn.itcast.test09.Person");
    //使用有参数的构造方法
    //c1.getConstructors();//获取所有的构造方法 这个方法
    
    //传递的是有参数的构造方法里面的参数类型 ,类型使用class形式传递
    Constructor cs = c1.getConstructor(String.class,String.class);
    //通过有参数的构造方法里面的参数类型,类型使用class形式传递
    Person p1 = (Person) cs.newInstance("lisi","100");
    System.out.println(p1.getName() + " " + p1.getId());
    }
    
     
    
    //操作无参数构造方法
    
        @Test
    
        public void test1() throws Exception{
    
            //得到Class
    
            Class c3 = Class.forName("cn.itcast.test09.Person");
    
            //得到Person类的实例
    
            Person p = (Person) c3.newInstance();
    
            //设置值
    
            p.setName("zhangsan");
    
            System.out.println(p.getName());
    
           
    
        }
  • 相关阅读:
    笔试题 易错题目解析
    SqlServer 函数 大全
    视频上传到自己的服务器打不开
    sql 计算生日提请日期
    Web API 异常处理(转)
    微软源代码管理工具TFS2013安装与使用详细图文教程(Vs2013)
    关于枚举的用法和类型转换
    html title换行方法 如a链接标签内title属性鼠标悬停提示内容换行
    JS的parent、opener、self对象
    uploadfiy
  • 原文地址:https://www.cnblogs.com/mzdljgz/p/10388874.html
Copyright © 2020-2023  润新知