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();
}