Java反射基础用法

215 阅读1分钟

这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战

前言

Java的反射想必有些同学还不够了解,或者了解但是没有实际使用过,那么我们今天就来入门使用以下Java反射的功能。

反射使用

Java的反射是Java的一个功能,它允许执行Java程序的过程中,对Java程序进行自省(官方说法 introspect),可以对程序的内部属性进行操作,例如我们可以获取类的成员变量的全部名称,并且展示出来。虽然挺起来不是很厉害的样子,但是这样类似的功能在C和C++中根本就不存在的。

让我们来看一个简单的例子,通过反射获取Stack类的声明方法:

public class ReflectionTest {

    @Test
    public void reflectionSimpleTest() {
        try {
            Class c = Class.forName("java.util.Stack");
            Method[] declaredMethods = c.getDeclaredMethods();
            for (int i = 0; i < declaredMethods.length; i++) {
                System.out.println(declaredMethods[i].toString());
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
}

输出结果展示如下:

public java.lang.Object java.util.Stack.push(java.lang.Object)
public synchronized java.lang.Object java.util.Stack.pop()
public synchronized java.lang.Object java.util.Stack.peek()
public boolean java.util.Stack.empty()
public synchronized int java.util.Stack.search(java.lang.Object)

一旦我们获取了类的成员方法,我们还可以根据获取的方法对象来获取更加详细的信息,来进行更细粒度的控制。示例代码如下:

@Test
public void reflectionSimpleTest() {
    try {
        Class c = Class.forName("java.util.Stack");
        Method[] declaredMethods = c.getDeclaredMethods();
        for (int i = 0; i < declaredMethods.length; i++) {
            Method method = declaredMethods[i];
            // 获取方法名
            System.out.println("Method name: " +method.getName());
            // 获取声明的类
            System.out.println("decl class: " + method.getDeclaringClass());
            // 获取参数类型
            Class<?>[] parameterTypes = method.getParameterTypes();
            for (int j = 0; j < parameterTypes.length; j++) {
                System.out.println("param #" + j + " " + parameterTypes[j]);
            }

            System.out.println("return type = " + method.getReturnType());
            System.out.println("--------");
        }
    } catch (Throwable e) {
        e.printStackTrace();
    }
}

输出参数展示如下:

Method name: push
decl class: class java.util.Stack
param #0 class java.lang.Object
return type = class java.lang.Object
--------
Method name: pop
decl class: class java.util.Stack
return type = class java.lang.Object
--------
Method name: peek
decl class: class java.util.Stack
return type = class java.lang.Object
--------
Method name: empty
decl class: class java.util.Stack
return type = boolean
--------
Method name: search
decl class: class java.util.Stack
param #0 class java.lang.Object
return type = int
--------

总结

以上就是反射的基础用法,反射可以让我们省去一下冗余的代码量,使得程序更加的简洁。扩展性更好,大家可以尝试在自己的项目中应用反射的方法进行实践。

参考资料

(www.oracle.com/technical-r…)