反射练习
直接上代码记录下:
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Properties; /* * Bootstrap class loader:它是虚拟机的内置类加载器,通常表示为null ,并且没有父null Platform class loader:平台类加载器可以看到所有平台类 ,平台类包括由平台类加载器或其祖先定义的Java SE平台API,其实现类和JDK特定的运行时类 System class loader:它也被称为应用程序类加载器 ,与平台类加载器不同。 系统类加载器通常用于定义应 用程序类路径,模块路径和JDK特定工具上的类 类加载器的继承关系:System的父加载器为Platform,而Platform的父加载器为Bootstrap * */ public class ReflectDemo { public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException { loadClass(); } private static void test1()throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException { //配置文件获取需要加载的类和方法 Properties pro=new Properties(); FileReader fr=new FileReader("Idea-test\\Config.txt"); pro.load(fr); String clsName=pro.getProperty("className"); String methodName=pro.getProperty("methodName"); //1.加载类 Class<?> cls = Class.forName(clsName); //2.获取类的构造函数 Constructor<?> constructor = cls.getConstructor(); //3.通过构造函数创建类的实例 Object o = constructor.newInstance(); //4.获取类发方法 Method declaredMethod = cls.getDeclaredMethod(methodName); //5.实例调用方法 declaredMethod.invoke(o); } /* * 加载类3中方式 * 1.Class的静态方法:Class.forName("com.reflect.Person") * 2.类实例的方法:p.getClass() * 3.类的class属性:Person.class * * 通过比较,3种方式获得的类内存地址都是同一个。 * 在内存中只有一份类内存地址 * */ public static void loadClass() throws ClassNotFoundException { Class<?> aClass = Class.forName("com.reflect.Person"); System.out.println(aClass); Person p=new Person(); Class<? extends Person> aClass1 = p.getClass(); System.out.println(aClass1); Class<Person> personClass = Person.class; System.out.println(personClass); System.out.println(aClass==aClass1);//true System.out.println(aClass==personClass);//true } }