1.反射介绍
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用他的任意一个方法和属性;
2.获取Class类对象
public class test02 {
public static void main(String[] args) throws ClassNotFoundException {
//使用class类中的静态方法forName(Stirng className)
Class<?> c1 = Class.forName("test.Fa");
System.out.println(c1);
System.out.println("=======");
//调用对象的getClass()方法,返回对象所属类的Class对象
Fa f=new Fa();
Class<? extends Fa> c2 = f.getClass();
System.out.println(c2);
System.out.println("=======");
//使用类的class属性来获取该类的对应的class对象
Class<Fa> faClass = Fa.class;
System.out.println(faClass);
}
}
三种方式
类名.class属性
对象名.getClass()方法
Class.for Name(全类名)方法
2.1示例代码
public class test02 {
public static void main(String[] args) throws ClassNotFoundException {
//使用class类中的静态方法forName(Stirng className)
Class<?> c1 = Class.forName("test.Fa");
System.out.println(c1);
System.out.println("=======");
//调用对象的getClass()方法,返回对象所属类的Class对象
Fa f=new Fa();
Class<? extends Fa> c2 = f.getClass();
System.out.println(c2);
System.out.println("=======");
//使用类的class属性来获取该类的对应的class对象
Class<Fa> faClass = Fa.class;
System.out.println(faClass);
}
}
2.2结果
class test.Fa
class test.Fa
class test.Fa
3.Class类获取构造方法对象的方法
方法
1.Constructor[] getConstructors() 返回所有公共构造方法对象的数 组
2.Constructor[] getDeclaredConstructors() 返回所有构造方法对象的数组
3.Constructor getConstructor(Class... parameterTypes) 返回单个公共构造方法对象
4.Constructor getDeclaredConstructor(Class... parameterTypes)返回单个构造方法对象
3.1示例代码
Class<?> c = Class.forName("com.ithema_02.Student");
Constructor<?>[] cons1 = c.getConstructors();//返回公共构造方法组
for (Constructor<?> con : cons1) {
System.out.println(con);
}
System.out.println("==========");
Constructor<?>[] cons = c.getDeclaredConstructors();//返回所有的构造方法组
for (Constructor con : cons) {
// System.out.println(con);
}
Constructor<?> c1 = c.getConstructor();//返回单个公共构造方法
Object obj=c1.newInstance();
System.out.println(obj);
System.out.println("==========");
Constructor<?> c2 = c.getDeclaredConstructor(String.class);//可以单个返回所有的构造方法
//暴力反射
c2.setAccessible(true);//为true时,取消范围检查
Object obj1=c2.newInstance("刘大花");
System.out.println(obj1);
T newInstance(Object...initargs) 根据指定的构造方法创建对象
3.2结果
public com.ithema_02.Student(java.lang.String,int,java.lang.String)
public com.ithema_02.Student()
Student{name='null', age=0, address='null'}
Student{name='刘大花', age=0, address='null'}
4.反射获取成员变量并使用
4.1Class类获取成员变量对象的方法
Field[] getFields() 返回所有公共成员变量对象的数组
Field[] getDeclaredFields() 返回所有成员变量对象的数组
Field getField(String name) 返回单个公共成员变量对象
Field getDeclaredField(String name) 返回单个成员变量对象
4.2示例代码:
Class<?> c = Class.forName("com.ithema_02.Student");
//Field[] getFields() 返回一个包含 Field对象的数组, Field对象反映由该 Class对象表示的类或接口的所有可访问的公共字段
//Field[] getDeclaredFields() 返回一个 Field对象的数组,反映了由该 Class对象表示的类或接口声明的所有字段
// Field[] fields = c.getFields();
Field[] f = c.getDeclaredFields();
for (Field field : f) {
System.out.println(field);
}
//Field getField(String name) 返回一个 Field对象,该对象反映由该 Class对象表示的类或接口的指定公共成员字段
//Field getDeclaredField(String name) 返回一个 Field对象,该对象反映由该 Class对象表示的类或接口的指定声明字段
Field field1 = c.getField("age");
System.out.println(field1);
System.out.println("========");
Field addressField = c.getField("address");
//获取无参构造方法创建对象
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
// obj.addressField = "天山";
//Field提供有关类或接口的单个字段的信息和动态访问
//void set(Object obj, Object value) 将指定的对象参数中由此 Field对象表示的字段设置为指定的新值
addressField.set(obj,"天山"); //给obj的成员变量addressField赋值为西安
field1.set(obj,20);
System.out.println(obj);
4.3运行结果:
private java.lang.String com.ithema_02.Student.namepublic int com.ithema_02.Student.agepublic java.lang.String com.ithema_02.Student.address
public int com.ithema_02.Student.age
Student{name='null', age=20, address='天山'}
5.反射获取成员方法
Method[] getMethods()
返回所有公共成员方法对象的数组,包 括继承的
Method[] getDeclaredMethods()
返回所有成员方法对象的数组,不包括 继承的
Method getMethod(String name, Class... parameterTypes)
返回单个公共成员方法对象
Method getDeclaredMethod(String name, Class... parameterTypes)
返回单个成员方法对象
另外:Object invoke(Object obj,Object...args)调用obj对象的成员方法,参数是args,返回值是Object类型
5.1代码示例
Class<Student> sc = Student.class;
System.out.println(sc);
Constructor<Student> con = sc.getConstructor();
Object obj=con.newInstance();
Method method = sc.getMethod("method1");
System.out.println(method);
System.out.println(obj);
method.invoke(obj);
Method method2 = sc.getMethod("method2", String.class);
method2.invoke(obj,"zhangsan");
5.2展示结果
class com.ithema_02.Studentpublic void com.ithema_02.Student.method1()Student{name='null', age=0, address='null'}methodmethod:zhangsan