首页 > 其他 > 详细

关于反射

时间:2021-03-14 23:41:00      阅读:24      评论:0      收藏:0      [点我收藏+]
1.getMethods方法能够获得类中所有的非私有方法,getDeclaredMethods方法能够获得类中的所有方法(包括私有方法),
getMethod("方法名")可以获取该方法。其他的获取构造器,获取类加载器,获取内部类,获取内部字段,获取注释等方法都大同小异。
2.通过类对象getClassLoader.getResourceAsStream可以获得输入流,但是不是以UTF-8解码的。
3.向私有方法注入对象时需要将setAccessible设置为true否则会抛出异常(在一个类下时不会)。
4.使用类对象构造器可以直接构造一个对象,getDeclaredConstructor(String.class),括号中代表类对象的参数类型。
附.Properties类继承了HashMap接口,所以读取到的值都是一一对应但键是不能相同的,它能读取.properties文件中的数据。
package study01;

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets;
import java.util.Properties;

public class TestAnimal {
    @Test
    public void testAnimal() throws NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, ClassNotFoundException, IOException {
        //加载类
        Class<Dog> dogClass = Dog.class;
        //getMethods方法能够获得类中所有的非私有方法
        Method[] methods = dogClass.getMethods();
        //getDeclaredMethods方法能够获得类中的所有方法,包括私有方法
        Method[] declaredMethods = dogClass.getDeclaredMethods();
        //获得类的类加载器
        ClassLoader classLoader = dogClass.getClassLoader();
        //创建一个Properties对象
        Properties properties = new Properties();
        //获取类加载时获得的资源
        InputStream ras = classLoader.getResourceAsStream("./study01/conf.properties");
        //为输入流设置字符集,不然读中文会乱码
        InputStreamReader isr = new InputStreamReader(ras, StandardCharsets.UTF_8);

        //将文件中的资源与properties连接
        properties.load(isr);
        //获取到关键字的值
        String name = properties.getProperty("名字");
        //获取到类的构造方法,这个是有参构造
        Constructor<Dog> constructor = dogClass.getDeclaredConstructor(String.class);
        //因为是private修饰的类所以需要开启暴力注入
        constructor.setAccessible(true);
        //将获取到的值作为对象的名字
        Dog dog = constructor.newInstance(name);
        dog.eat();
        //获得类的公共指定名字的方法
        Method eat = dogClass.getMethod("eat");
        eat.invoke(dog);

        //获得类的private方法
        Method getEat = dogClass.getDeclaredMethod("getEat");
        //设置暴力注入
        getEat.setAccessible(true);
        //获取到类的构造方法,这个是无参构造
        Constructor<Dog> declaredConstructor = dogClass.getDeclaredConstructor();
        declaredConstructor.setAccessible(true);
        //创建一个为无参构造实例
        Dog dog2 = declaredConstructor.newInstance();
        dog2.eat();
        Object invoke = getEat.invoke(dog2);
        System.out.println(invoke);
    }
}
package study01;

public class Dog implements Animal{
    private String dogName;

    private Dog(String dogName) {
        this.dogName = dogName;
    }
    private Dog() {
    }

    @Override
    public void eat() {
        System.out.println(this.dogName+"吃"+getEat());
    }

    private String getEat() {
        return "骨头";
    }

    public String getDogName() {
        return dogName;
    }
}
package study01;

public interface Animal {
    void eat();
}

 

关于反射

原文:https://www.cnblogs.com/wenrou-pan/p/14533673.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!