• java reflect


    对象有编译类型和运行类型

       Person man=new Man();

       编译类型 Person 运行类型Man

    获取Class实例的方法Class的实例就是类的字节码
    (一个类在虚拟机中只有一份字节码)

       1,Class clazz1=Animal.class;
       2, Class<Person>clazz=(Class<Person>) Class.forName("com.m01.reflect.Person");
       3,Person man=new Man();
        Classman.getClass();

       基本数据类型

        byten short char int long float double boolean void

         int.class,void.class


    一,获取类的构造器

        @Test
        public void test() throws Exception {
            Class clz=Class.forName("com.m01.reflect.Dog");
            Constructor[]csAll=clz.getConstructors();//获取所有public的构造器,
            csAll=clz.getDeclaredConstructors();//获取本类的所有构造器
            Constructor c=clz.getConstructor(null);//获取指定参数类型的public的构造器
            c=clz.getDeclaredConstructor(null);//获取指定参数类型的构造器
            //调用构造器,实例化对象
            c.setAccessible(true);//针对private的属性 进行强制执行(实例化对象)
            Dog dog=(Dog) c.newInstance(null);
            dog.doWork();
        }

    二,获取类的方法

    @Test
        public void testMethod() throws Exception {
            Class clz=Class.forName("com.m01.reflect.Dog");
            Method[]methods=clz.getMethods();//获取所有的public类型的方法包括父类的方法
            methods=clz.getDeclaredMethods();//只获取本类中所有的方法
            Method method=clz.getMethod("doWork", null);//获取所有的满足参数列表的public类型的方法包括父类的方法
            method=clz.getDeclaredMethod("sing", null);//只获取本类中满足参数列表所有的方法
            //调用方法,实例化对象
        
         method=clz.getDeclaredMethod("ooxx", String[].class);//调用有可变参数的方法

          method.invoke(clz.newInstance(), new Object[]{new String[]{"大桥","潘金莲"}});

            method.setAccessible(true);
            method.invoke(clz.newInstance(), null);
            System.out.println(method.toString());
            for(Method m :methods){
                System.out.println(m.toString());
            }
        }

    三,反射字段

    @Test
        public void testField() throws Exception{
            Class clz=Class.forName("com.m01.reflect.Dog");
            Field[]fields=clz.getFields();//获取所有的public类型的属性包括父类的属性
            fields=clz.getDeclaredFields();//只获取本类中所有的属性
            Field field=clz.getField("manName");//获取所有的public类型的包括父类在内的指定属性
            field=clz.getDeclaredField("dogName");//获取本类中指定的属性
            //使用类的属性
            field.setAccessible(true);//强制忽略属性的private 
            Object obj=clz.newInstance();
            field.set(obj, "大花花");//给属性分配所属对象和值
            Object value=field.get(obj);//通过对象获取该字段的值
            System.out.println(value);
            System.out.println(obj.toString());
            System.out.println(field.getType());
            System.out.println(field);
            System.out.println(Arrays.asList(fields));
        }

    四,其他的API

       Class类中: int getModifiers():获得修饰符 String getName():返回类的全限定名

        Package getPackage():获得该类的包 String getSimpleName():获得类的简单名字

       Class getSuperclass():获得类的父类 boolean isArray():判断该Class实例是否是数组

        boolean isEnum() :判断该Class实例是否是枚举

    五,读取项目中文件的方法

       1,把路径写死

    @Test
        public void testReadFile1() throws Exception{
            //1绝对路径
            String fileName="C:\eclipseprograms\program2\javacollections\src\db.properties";
            Properties pro=new Properties();
            InputStream ins=new FileInputStream(fileName);
            pro.load(ins);
            System.out.println(pro);
        }

       2,相对路径

    @Test
        public void testReadFile2() throws Exception{
            //相对路径,使用ClassLoader类的静态方法
            Properties pro=new Properties();
            InputStream ins=ClassLoader.getSystemResourceAsStream("db.properties");
            pro.load(ins);
            System.out.println(pro);
        }
        @Test
        public void testReadFile3() throws Exception{
            //相对路径,通过反射获取ClassLoader的实例
            Properties pro=new Properties();
            Class clz=Class.forName("com.m01.reflect.Dog");
            ClassLoader loader=clz.getClassLoader();
            InputStream ins=ClassLoader.getSystemResourceAsStream("db.properties");
            ins=loader.getResourceAsStream("db.properties");
            pro.load(ins);
            System.out.println(pro);
        }
        @Test
        public void testReadFile4() throws Exception{
            //相对路径,通过当前线程获取ClassLoader的实例
            Properties pro=new Properties();
            Class clz=Class.forName("com.m01.reflect.Dog");
            ClassLoader loader=clz.getClassLoader();
            InputStream ins=ClassLoader.getSystemResourceAsStream("db.properties");
            ins=loader.getResourceAsStream("db.properties");
            ins=Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
            pro.load(ins);
            System.out.println(pro);
        }
  • 相关阅读:
    Ubuntu下speedtest的安装
    Ubuntu下快速安装LAMP server
    用python3.3爬取图片
    用python3.3结合snmpget截取信息
    开源数据库Postgresql的备份和恢复
    vuedraggable 两个不同结构的数组之间拖拽
    MyBatis 使用另一个 mapper 中的 resultMap 和 sql
    怎样处理从后台传来大量数据的分页操作
    doc命令操纵数据库
    (全)Mac中mysql的root账户初始密码忘记解决办法以及更改
  • 原文地址:https://www.cnblogs.com/m01qiuping/p/6413143.html
Copyright © 2020-2023  润新知