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);