zoukankan      html  css  js  c++  java
  • 反射

    java语言的反射机制(解剖)  在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法

    获取Class对象的三种方式  

      1. 通过对象获取class对象 Person p=new Person();Class c1=p.getClass();

      2.通过类名获取 Class c2=Person.class;

      3.通过class类中静态方法ForName(完整的报名+类名)Class c3=Class.forName("com.oracle.demo01.Person");

    通过反射获取 构造方法Constructor 成员变量Field  成员方法Method

    获取 构造方法 getConstructor  getDeclaredConstructor  getConstructors()  getDeclaredConstructors()

    获取 成员变量Field getField   getDeclaredField  getFields   getDeclaredField s

     获取成员方法Method getMethod  getDeclaredField getMethods  getDeclaredFields

     public Constructor<T> getConstructor(Class<?>... parameterTypes) 获取public修饰, 指定参数类型所对应的构造方法

     public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取指定参数类型所对应的构造方法(包含私有的)

     public Constructor<?>[] getConstructors() 获取所有的public 修饰的构造方法

     public Constructor<?>[] getDeclaredConstructors() 获取所有的构造方法(包含私有的)

    注意:私有 构造方法 成员变量 成员方法 暴力访问, 通过setAccessible(boolean flag)方法

    通过 反射获取 构造方法Constructor 成员变量Field  成员方法Method应用问题

    1.通过构造方法类Constructor中的方法,创建对象public T newInstance(Object... initargs)

    2.通过方法,给指定对象的指定成员变量赋值或者获取值

    public void set(Object obj, Object value)在指定对象obj中,将此 Field 对象表示的成员变量设置为指定的新值public Object get(Object obj)返回指定对象obj中,此 Field 对象表示的成员变量的值

    3. 执行找到的方法 public Object invoke(Object obj,  Object... args)执行指定对象obj中,当前Method对象所代表的方法,方法要传入的参数通过args指定

    泛型擦除:程序编译后产生的.class文件中是没有泛型约束的,这种现象我们称为泛型的擦除

    public class Demo06 {
    	public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
    		ArrayList<String> arr=new ArrayList<String>();
    		arr.add("abc");
    		//泛型擦除
    /*		arr.add("123");
    		arr.add(4.5);*/
    		//获取ArrayList字节码文件对象
    		Class c=arr.getClass();
    		//获取add这个方法等成员方法对象
    		Method m=c.getMethod("add", Object.class);
    		//执行方法
    		m.invoke(arr,123);
    		m.invoke(arr, 4.5);
    		System.out.println(arr);
    	}
    }
    

      

    反射配置文件

    package com.oracle.demo01;
    
    import java.io.FileReader;
    import java.io.IOException;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.Properties;
    
    public class Demo01 {
    
    	public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException, NoSuchMethodException, SecurityException {
    		//明确数据源
    		FileReader fr=new FileReader("src/com/oracle/demo01/pro.properties");
    		//创建properties集合
    		Properties pro=new Properties();
    		//将文件中的键值对读取到集合
    		pro.load(fr);
    		//获取要创建的字节码文件的类名
    		String className=pro.getProperty("className");
    		//获取方法名
    		String methodName=pro.getProperty("methodName");
    		//开始获取字节码文件对象
    		Class c=Class.forName(className);
    		//获取成员方法对象
    		Method m=c.getMethod(methodName);
    		//快速快速创建对象
    		Object obj=c.newInstance();
    		//执行方法
    		m.invoke(obj);
    
    	}
    
    }
    

      

    #className=com.oracle.demo01.Student
    #methodName=study
    className=com.oracle.demo01.Person
    methodName=eat
    #className=com.oracle.demo01.Work
    #methodName=work
    

      

  • 相关阅读:
    第十四周学习进度
    二阶段冲刺(七)
    二阶段冲刺(六)
    二阶段冲刺(五)
    二阶段冲刺(四)
    二阶段冲刺(三)
    二阶段冲刺(二)
    二阶段冲刺(一)
    第十三周学习进度
    linux初级学习笔记二:linux操作系统及常用命令,文件的创建与删除和命名规则,命令行展开以及linux中部分目录的作用!(视频序号:02_3)
  • 原文地址:https://www.cnblogs.com/zqy6666/p/12353097.html
Copyright © 2011-2022 走看看