【JavaSE】反射的总结
2021-01-09 14:32
                         标签:voc   chm   header   通过   进制   ssi   破坏   获取   成员变量    @ 加载 连接 初始化 类的初始化时机(什么时候被加载) 类加载器 引导类加载器(Bootstrap ClassLoader) 拓展类加载器(Extension ClassLoader) 应用类加载器(Application ClassLoader) getClass() 获取所有 获取单个 代码:获取无参构造函数 代码:获取带参构造函数 代码:获取私有构造函数  注意:如果不设置  constructor.setAccessible(true); 获取所有 获取单个  感觉这个案例很能说明:反射破坏了封装性 【JavaSE】反射的总结 标签:voc   chm   header   通过   进制   ssi   破坏   获取   成员变量    原文地址:https://www.cnblogs.com/popo33/p/12961789.html
一、类的加载概述
java.lang.Class对象java.exe命令来运行某个主类
二、反射的基本使用
2.1 获取Class字节码对象
.class
Class.forName("文件全路径")2.2 获取构造方法
public Constructor[] getConstructors()
public Constructor[] getDeclaredConstructors()
public Constructorcon.newInstance();//使用构造方法对象表示的构造方法来创建该构造方法的声明类的新实例
public class ReflexDemo01 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        // 获取字节码对象
        Class person = Class.forName("Person");
        // 获取构造方法
        Constructor constructor = person.getConstructor();
        // 实例化对象
        Object obj = constructor.newInstance();
        System.out.println(obj);//Person@1b6d3586
    }
}
 public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class person = Class.forName("Person");
        Constructor constructor = person.getConstructor(String.class, String.class, int.class);
        Object obj = constructor.newInstance("张三","男",20);
        System.out.println(obj);
    }
 public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class person = Class.forName("Person");
        
        Constructor constructor = person.getDeclaredConstructor(String.class, String.class, int.class);
      
        constructor.setAccessible(true);
        
        Object obj = constructor.newInstance("张三","男",20);
       
        System.out.println(obj);
    }
会报错:java.lang.IllegalAccessException: Class ReflexDemo01 can not access a
member of class Person with modifiers "private"2.3 获取成员变量
2.4 获取成员方法并使用
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class person = Class.forName("Person");
        Constructor constructor = person.getDeclaredConstructor(String.class, String.class, int.class);
        constructor.setAccessible(true);
        Object obj = constructor.newInstance("张三","男",20);
        // Method[] methods = c.getMethods(); // 获取自己的包括父亲的公共方法
        // Method[] methods = c.getDeclaredMethods(); // 获取自己的所有的方法
        //Method[] methods = c.getMethod(String name,Class>... parameterTypes)
        // 第一个参数表示的方法名,第二个参数表示的是方法的参数的class类型
        Method method01 = person.getMethod("method01");
        Method method02 = person.getMethod("method02", String.class);
        Method method03 = person.getDeclaredMethod("method03", String.class, int.class);
        method03.setAccessible(true);
        method01.invoke(obj);
        method02.invoke(obj,"hello");
        Object resultStr = method03.invoke(obj, "hello", 123);
        System.out.println(resultStr);
    }
三、案例
3.1 通过反射运行配置文件
/**
 * 通过反射运行配置文件
 */
public class ReflexDemo02 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        // 读取键值对数据
        Properties prop = new Properties();
        FileReader fr = new FileReader("F:\\Projects\\idea_projects\\javaseTest\\09reflex\\src\\class.txt");
        prop.load(fr);
        fr.close();
        // 获取文件数据
        String className = prop.getProperty("className");
        String methodName = prop.getProperty("methodName");
        // 反射
        Class c = Class.forName(className);
        Constructor constructor = c.getConstructor();
        Object obj = constructor.newInstance();
        Method method = c.getMethod(methodName);
        method.invoke(obj);
    }
}
3.2 通过反射越过泛型检查
/**
 * 通过反射越过泛型检查
 */
public class ReflexDemo03 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        // 创建集合
        ArrayList3.3 通过反射写一个Tool工具类,设置任意对象的任意属性
public class PropertyTools {
    /**
     * 给传入对象设置属性
     */
    public void setProperty(Object obj,String propertyName,Object value) throws NoSuchFieldException, IllegalAccessException {
        // 根据对象获取字节码对象
        Class c = obj.getClass();
        // 根据名称获取成员变量
        Field field = c.getDeclaredField(propertyName);
        // 取消访问检查
        field.setAccessible(true);
        // 给对象的成员变量赋值为指定的值
        field.set(obj,value);
    }
    /**
     * 测试该工具类
     */
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Person person = new Person();
        PropertyTools tools = new PropertyTools();
        tools.setProperty(person,"name","林青霞");
        tools.setProperty(person,"sex","女");
        tools.setProperty(person,"age",20);
        System.out.println(person);//Person{name=‘林青霞‘, sex=‘女‘, age=20}
    }
}
上一篇:Python之Flask框架一
下一篇:python开发环境的搭建和设置