链接:反射概述
1、获取类的信息
1.1、获取Class对象
a、调用对象的getClass()方法;
Student stu=new Student();
Class clazz=stu.getClass();
b、调用类的class属性;
Class clazz=String.class;
c、使用Class类的forName()方法
Class clazz=Class.forName("cn.zhangwendi.day7.Student"); //(类名+包名)
//throws ClassNotFoundException
1.2、从Class对象获取信息
a、访问Class对应的类所包含的构造方法(Constructor);
返回值 | 方法 | 说明 |
Constructor | getConstruct(Class[ ] params) | 返回此Class对象所表示的类的指定的public构造方法。构造方法的参数类型与params所指定的参数类型相匹配。 例:Constructor con=clazz.getConstruct(String.class,int.class) |
Constructor[ ] | getConstructs() | 返回所有public构造方法。 |
Constructor | getDeclaredConstruct(Class[ ] params) | 返回指定的构造方法,与访问级别无关。 |
Constructor[ ] | getDeclaredConstructs() | 返回所有的构造方法,与访问级别无关。 |
b、访问Class对应的类所包含的方法(Method);
返回值 | 方法 | 说明 |
Method | getMethod(String name,Class[ ] params) | 返回此Class对象所表示的类的指定的public方法。name参数用于指定方法名称,params参数是按声明顺序标志该方法参数类型的Class对象的一个数组。 例:Method meth=clazz.getMethod(name,String.class); |
Method[ ] | getMethods() | 返回所有public方法。 |
Method | getDeclaredMethod(String name,Class[ ] params) | 返回指定的方法,与访问级别无关。 |
Method[ ] | getDeclaredMethods() | 返回所有的方法,与访问级别无关。 |
c、访问Class对应的类所包含的属性(Field);
返回值 | 方法 | 说明 |
Field | getField(String name) | 返回此Class对象所表示的类的指定的public属性。name参数用于指定方法名称 例:Field field=clazz.getField(age); |
Field[ ] | getFields() | 返回所有public属性。 |
Field | getDeclaredField(String name,Class[ ] params) | 返回指定的属性,与访问级别无关。 |
Field[ ] | getDeclaredFields() | 返回所有的属性,与访问级别无关。 |
d、访问Class对应的类所包含的注解(Annotation);
。。。。。。
e、访问Class对应的类的其他信息
。。。。。。
2、创建对象
通过反射来创建对象有如下两种方式:
a、使用Class对象newInstance方法创建对象;(实质是上利用默认构造方法来创建该类的实例)
Class clazz =Date.class;
Date date=(Date)clazz.newInstance();//需要抛出异常。(throws InstantiationException, IllegalAccessException )
b、使用Constructor对象创建对象(可以使用指定的构造方法来创建实例)
Class clazz = Student.class;
Constructor con=clazz.getConstructor(String.class,int.class);//throws NoSuchMethodException, SecurityException
Student stu=(Student)con.newInstance("張大仙",18);
/*throws InstantiationException,IllegalAccessException,IllegalArgumentException, InvocationTargetException */
3、访问类的属性
使用Field对象可以获取对象的属性。通过Field对象可以对属性进行取值或赋值操作。
返回值 | 方法 | 说明 |
void | setAccessible(boolean flag) | 对获取到的属性设置访问权限。参数为TRUE,可以对私有属性取值和赋值。 |
void | set(Object obj,Xxx val) | 将val赋值给obj |
void | set(Object obj,Object val) | 将val赋值给obj |
Object | getXxx(Object obj) | |
Object | get(Object obj) |
4、访问类的方法
使用Method对象可以调用对象的方法
返回值 | 方法 | 说明 |
Object | invoke(Object obj,Object...args) | obj是执行该方法的对象,args是执行该方法时传入的该方法的参数。 |
5、使用Array类动态创建和访问数组
在java.lang.reflect包下还提供了一个Array类,Array类的对象可以代表所有的数组。程序可以通过使用Array类来动态的创建数组,操作数组元素等。
import java.lang.reflect.Array;
public class Test {
public static void main(String[] args) {
Object arr=Array.newInstance(String.class, 10);
Array.set(arr, 0, "zhang");
Array.set(arr, 1, "zhao");
Array.set(arr, 2, "wang");
Object o0=Array.get(arr, 0);
Object o1=Array.get(arr, 1);
Object o2=Array.get(arr, 2);
System.out.println(o0);
System.out.println(o1);
System.out.println(o2);
}
}
小练习:
1、使用反射,遍历某个类的所有的构造方法,属性,方法,打印到控制台
2、 // 需求说明 // 定义Student类,包含:姓名和年龄等属性,有参和无参构造方法,输出所有信息的方法 // 使用多种方法生成一个Student类的Class对象 // 使用Class类获取Student类的结构信息并输出 // 通过有参(无参)构造方法动态创建Student类的对象 // 使用反射修改和查询Student类的姓名属性 // 使用反射动态执行Student类输出所有信息的方法