Java中的反射函数——Class、getMethod、newInstance等
Java中反射提供了一种让程序在运行时动态地获取类的信息、访问类成员变量和方法的机制。在Java中,反射的核心类是java.lang.Class。
1. Class类
Class类是Java反射机制的核心,它代表一个类或者一个接口的类型。我们可以通过调用类对象的getClass()方法来获取这个类的Class对象,例如:
Class<?> c1 = new String().getClass(); Class<?> c2 = String.class;
这两种方式都可以获取String类的Class对象。
2. getMethod和getDeclaredMethod方法
Class类提供了多个方法来获取成员方法,其中最常用的是getMethod()和getDeclaredMethod()。
getMethod()可以获取一个类的公共方法,它的用法如下所示:
public Method getMethod(String name, Class<?>... parameterTypes)
throws NoSuchMethodException, SecurityException
其中,name参数指定了要获取的方法的名称;parameterTypes参数指定了方法的参数类型。
getDeclaredMethod()可以获取一个类的所有方法,包括私有方法,它的用法和getMethod()类似:
public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
throws NoSuchMethodException, SecurityException
这里需要注意的是,getDeclaredMethod()获取的是类的所有方法,包括私有方法,而getMethod()只返回公共方法。
3. newInstance方法
Class类的newInstance()方法可以创建一个类的实例,它的用法如下所示:
public T newInstance() throws InstantiationException, IllegalAccessException
这里的T表示创建的对象类型,可以是任意类型。需要注意的是,newInstance()方法需要类有一个无参构造函数,否则会抛出InstantiationException异常。
当我们获取了一个类的Class对象之后,就可以通过newInstance()方法创建一个对象。例如:
Class<?> cls = Class.forName(className); Object obj = cls.newInstance();
这里的className是一个字符串,表示类的名称。通过Class.forName()方法可以获取类的Class对象,然后调用newInstance()方法创建对象。
4. getField和getDeclaredField方法
Class类的getField()和getDeclaredField()方法可以获取一个类的字段。其中,getField()获取的是公共字段,而getDeclaredField()获取的是所有字段,包括私有字段。
getField()方法的用法如下:
public Field getField(String name) throws NoSuchFieldException, SecurityException
其中,name参数指定了要获取的字段的名称。
getDeclaredField()方法的用法和getField()类似:
public Field getDeclaredField(String name) throws NoSuchFieldException, SecurityException
这里需要注意的是,getDeclaredField()获取的是类的所有字段,包括私有字段,而getField()只返回公共字段。
5. set和get方法
Class类的set()和get()方法可以设置和获取对象的字段值。例如:
Field field = obj.getClass().getField(fieldName); field.set(obj, value); Object val = field.get(obj);
这里的fieldName是字段的名称,value是字段要设置的值,val是获取到的字段值。
以上就是Java中反射常用的几个函数,Class、getMethod、newInstance、getField、set和get方法。使用反射机制可以提高程序的灵活性和可扩展性,但也容易造成性能问题,因此需要在使用时慎重考虑。
