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