一、反射是什么
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。
二、获取Class对象的三种方法
类名.class属性
Class<Student> c1 = Student.class;
System.out.println(c1);
对象名.getClass()方法
Student s = new Student();
Class<? extends Student> c3 = s.getClass();
Class.forName(全类名)方法
//使用Class类中的静态方法forName(String className)
Class<?> c4 = Class.forName("test.Student");
三、获取构造方法并使用
Constructor<?>[] getConstructors() 返回所有公共构造方法对象的数组
Class<?> c = Class.forName("fanshe.Student");
//所有公用方法
Constructor<?>[] constructors = c.getConstructors();
for(Constructor constructor:constructors){
System.out.println(constructor);
}
Constructor<?>[] getDeclaredConstructors() 返回所有构造方法对象的数组
Class<?> c = Class.forName("fanshe.Student");
//所有方法
Constructor<?>[] declaredConstructors = c.getDeclaredConstructors();
for(Constructor constructor:declaredConstructors){
System.out.println(constructor);
}
Constructor getConstructor(Class<?>… parameterTypes) 返回单个公共构造方法对象
Class<?> c = Class.forName("fanshe.Student");
//单个共用方法
Constructor<?> con = c.getConstructor(String.class,int.class,String.class);
System.out.println(con);
Object o = con.newInstance("100",12,"123");
System.out.println(o);
Constructor getDeclaredConstructor(Class<?>… parameterTypes) 返回单个构造方法对象
Class<?> c = Class.forName("fanshe.Student");
//单个方法
Constructor<?> con = c.getDeclaredConstructor(String.class);
//暴力反射 setAccessible(boolean flag) 值为true 取消访问检查
con.setAccessible(true);
Object obj = con.newInstance("123");
System.out.println(obj);
四、获取成员变量并使用
Field[] getFields() 返回所有公共成员变量对象的数组
Field[] getDeclaredFields() 返回所有成员变量对象的数组
Field getField(String name) 返回单个公共成员变量对象
Field getDeclaredField(String name) 返回单个成员变量对象
Class<?> c = Class.forName("fanshe.Student");
//反应一个包含对象的数组,公用对象 Field[] fields=c.getFields();
Field[] fields=c.getFields();
for(Field field:fields){
System.out.println(field);
}
System.out.println("--------");
//反应一个包含对象的数组,所有的 Field[] fields1=c.getDeclaredFields();
Field[] fields1=c.getDeclaredFields();
for(Field field:fields1){
System.out.println(field);
}
System.out.println("--------");
//Field add=c.getField("address");反应一个对象,但是为公共成员
//Field add=c.getDeclaredField("address");返回一个对象,所有对象
Field add=c.getField("address");
Constructor<?> con = c.getConstructor();
Object o = con.newInstance();
add.set(o,"习安安");
System.out.println(o);
五、获取成员方法并使用
Method[] getMethods() 返回所有公共成员方法对象的数组,包括继承的
Method[] getDeclaredMethods() 返回所有成员方法对象的数组,不包括继承的
Method getMethod(String name, Class<?>… parameterTypes) 返回单个公共成员方法对象
Method getDeclaredMethod(String name, Class<?>… parameterTypes) 返回单个成员方法对象
Class<?> c = Class.forName("fanshe.Student");
//Method[] getMethods() 放回一个包含方法对象的数组,反映该对象的类或者接口的所有公用方法,包含超类超级接口继承的类
Method[] methods=c.getMethods();
for(Method method:methods){
System.out.println(method);
}
System.out.println("--------");
//Method[] getDeclaredMethods()返回一个包含对象的数组,反映对象类或者接口的所有方法
Method[] methods1=c.getDeclaredMethods();
for(Method method:methods1){
System.out.println(method);
}
System.out.println("--------");
//获取一个方法getMethod()
Method method = c.getMethod("a0");
Constructor<?> con = c.getConstructor();
Object ojb = con.newInstance();
//invoke()制定对象使用该方法
method.invoke(ojb);
Method m3 = c.getMethod("a3", String.class);
m3.invoke(ojb,"谢总是猪");