------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
反射
1、由来:
程序后期扩展,无源码修改的扩展
2、java.lang.Class 描述.class的类
java.lang.reflect.Constructor 描述构造方法的类
java.lang.reflect.Field 描述成员变量的类
java.lang.reflect.Method 描述成员方法的类
3、实现反射:
A、获取class文件对象
第一种:通过对象获取
Person p=new Person();
Object中getClass(),返回值是Class类型
第二种:
通过类的静态属性class获取
第三种:通过class类的静态方法forName获取
class.forName("包名.Person");//要写全类名
B、获取构造方法
Class类中Constructor[] getConstructors() 获取class文件中公共权限的构造方法,
Class类中ConStructor getConstructor(class...c)获取公共权限的指定参数列表的构造函数。如果获取没有可变参数的可以不写参数列表。
Class类中Constructor[] getDeclaredConstructors() 获取全部构造函数
Class类中ConStructor getDeclaredConstructor(Class...c)可以单独获取私有的构造方法
运行构造方法:
Constructor类中Object newInstance(Object...o)
Constructor类的父类Accessible类中setAccessible(boolean 0)传递的若是true,运行期间则取消JVM的访问检查,即可运行私有构造函数。
Class类中 Object newInstance()可以直接获取public修饰的空参数的构造方法并运行。前提必须保证存在这样的方法。
C、获取普通方法:
Class类中Method[] getMathods() 返回字节码文件中的方法,这些方法是public修饰的,包括继承的和实现的方法。
Class类中Method getMethod(String 方法名,Class...c)返回一个方法,传递方法名和参数列表
Class类中getDeclareMethod(String 方法名,Class...c)可以获取私有的构造方法
运行普通方法:
Method类中Object invoke(Object o对象,Object...args方法中的参数)
4、运用反射实现泛型的临时擦除
1 import java.util.*; 2 import java.lang.reflect.*; 3 public class ListDemo { 4 public static void main(String[] args) throws Exception{ 5 6 ArrayList<String> array = new ArrayList<String>(); 7 array.add("asdf"); 8 array.add("dgfer"); 9 //获取ArrayList类的字节码文件对象 10 Class clazz = array.getClass(); 11 //获取添加方法add 12 Method method = clazz.getMethod("add", Object.class); 13 method.invoke(array, 123); 14 method.invoke(array, 12.34); 15 method.invoke(array, true); 16 System.out.println(array); 17 Iterator it = array.iterator(); 18 while(it.hasNext()){ 19 System.out.println(it.next()); 20 } 21 } 22 }
来源:https://www.cnblogs.com/ezreal33/p/3935996.html