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);
    }
原文地址:https://www.cnblogs.com/m01qiuping/p/6413143.html