反射的常见用法
1.获取Class对象
1.通过类名获取
使用类的全限定名调用Class.forName()方法即可获取Class对象。例如:
Class<?> clazz = Class.forName("com.example.MyClass");
这种方法会触发类的初始化,如果类不存在或未被初始化,则会抛出ClassNotFoundException异常。
2.通过类字面量获取
使用类字面量即可获取Class对象。例如:
Class<?> clazz = MyClass.class;
这种方法不会触发类的初始化,如果类不存在,则会抛出NoClassDefFoundError错误。
3.通过对象获取
使用对象的getClass()方法即可获取Class对象。例如:
MyClass myClass = new MyClass();
Class<?> clazz = myClass.getClass();
这种方法不会触发类的初始化,如果对象为null,则会抛出NullPointerException异常。
需要注意的是,以上三种方法获取的Class对象是同一个对象。即使在不同的类加载器环境中,也可以通过Class对象来获取同一个类的信息。
2.获取Class后的常用方法
2.1获取类名
getName()
获取Class对象所表示的类的全限定名。
getSimpleName()
2.2获取字段
getDeclaredFields()
获取Class对象所表示的类中声明的所有字段(不包括从父类继承而来的字段)。
getFields()
获取Class对象所表示的类中所有public字段,包括从父类继承而来的字段。
2.3获取方法
getDeclaredMethods()
获取Class对象所表示的类中声明的所有方法(不包括从父类继承而来的方法)。
getMethods()
获取Class对象所表示的类中所有public方法,包括从父类继承而来的方法。
2.4获取构造器
public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
需要注意的是,getConstructor()方法只能获取public构造方法,如果需要获取非public构造方法,则需要使用getDeclaredConstructor()方法。如果不存在指定的构造方法,则会抛出NoSuchMethodException异常。同时,需要注意使用反射机制需要小心处理异常
2.5创建对象
使用Class对象的newInstance()方法 通过Class对象的newInstance()方法可以创建一个该Class对应类的实例,前提是该类必须具有无参构造方法。示例如下:
Class<?> clazz = MyClass.class;
Object obj = clazz.newInstance();
使用Constructor对象的newInstance()方法 如果需要调用带有参数的构造方法来创建对象,则可以通过Constructor对象的newInstance()方法实现。示例如下:
Class<?> clazz = MyClass.class;
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Object obj = constructor.newInstance("test", 123);
2.6动态调用方法
Class<MyClass> myClassClass = MyClass.class;
Method test = myClassClass.getMethod("test", String.class);
Object lisi = test.invoke(new MyClass(), "lisi");
System.out.println(lisi);
通过invoke方法来进行动态调用方法