反射

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

  

 

posted @ 2020-02-23 18:13  xiren88  阅读(121)  评论(0编辑  收藏  举报