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