欢迎访问宙启技术站
智能推送

Java中的反射函数——Class、getMethod、newInstance等

发布时间:2023-06-06 11:25:29

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方法。使用反射机制可以提高程序的灵活性和可扩展性,但也容易造成性能问题,因此需要在使用时慎重考虑。