2018-3-14


反射获取空参构造方法并运行:


第一步:获取class文件对象


Class c = Person.class;


第二步:从class文件对象中获取类中的构造方法


//Constructor[] constructors = c.getConstructors();//getConstructors()只能获得权限为公有的所有构造器 
 //获得指定的空参构造器 
 Constructor con = c.getConstructor();


第三步:运行空参构造


Object object = con.newInstance();


调用子类特有方法需向下转型:


反射获取有参构造方法并运行:

Person p = (Person)object;


第一步:获取class文件对象



Class c = Person.class;

第二步:从class文件对象中获取类中的构造方法


//获得指定的空参构造器 
 Constructor con = c.getConstructor(String.class,String.class);//参数是对应构造器的参数列表的class文件对象


第三步:运行有参构造



Object object = con2.newInstance("name","dalian");//这里要传运行的实际参数

反射获取构造方法并运行的快捷方式:(前提:被反射的类必须具有空参构造方法,权限必须为public)

第一步:获取class文件对象


Class c = Person.class;


第二步:直接调用Class类中的方法newInstance()


Object object = c.newInstance(); //直接创建被反射类的对象实例


反射获取私有构造方法运行:(破坏了封装性和安全性)

getDeclaredConstructors()可以获取所有的构造方法,包括私有的构造方法

getDeclaredConstructor(可变参数)获得指定参数列表的构造方法

setAccessible(true)取消运行时期的权限检查


反射获取成员变量,并改值:



Class c = Class.forName("com.xiao.reflection.Person"); 
 Field[] fields = c.getFields();//获取所有公共的成员变量 
 Field[] declaredFields = c.getDeclaredFields();//获取所有成员变量,包括私有 
 Field field = c.getField("name");//获取指定的公有成员变量 
 Field declaredField = c.getDeclaredField("name");//获得指定的成员变量,包括私有 
 Object o  = c.newInstance(); 
 //修改值 
 declaredField.set(o, "笑笑");//第一个参数是对象,第二个参数是修改后的值


反射获取空参成员发方法,并运行:

Class c = Class.forName("com.xiao.reflection.Person"); 
 Method[] methods = c.getMethods();//获取的是所有公共的成员方法,包括继承的 
 //调用getMethod(name, parameterTypes)获取指定的成员方法 
 Method method = c.getMethod("eat"); 
 //调用invoke(obj, args);运行指定方法 
 Object o = c.newInstance(); 
 method.invoke(o);


反射获取有参成员方法,并运行:


Class c = Class.forName("com.xiao.reflection.Person"); 
 Method method = c.getMethod("sleep", String.class); 
 Object o = c.newInstance(); 
 method.invoke(o,"笑笑");



泛型擦除:

Java中的泛型是伪泛型,编译后的class文件是没有泛型的

例:加了String泛型的集合 添加整型数据


ArrayList<String> array = new ArrayList<>(); 
 //获取集合ArrayList类的class文件的对象 
 Class c = array.getClass(); 
 //获取ArrayList.class文件中的方法add 
 Method method = c.getMethod("add",Object.class); 
 //添加数据 
 method.invoke(array, 12); 
 method.invoke(array, 1222); 
 method.invoke(array, 1000); 
 System.out.println(array);