反射练习

直接上代码记录下:

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
    }
}

 

posted @ 2020-10-19 11:28  zhuyapeng  阅读(98)  评论(0编辑  收藏  举报