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

Java反射经典实例 Java Reflection Cookbook

发布时间:2023-05-14 09:32:46

Java反射是Java语言的重要特性,可以让我们在程序运行时动态地获取并操作类的属性、方法和构造函数等信息。本文将为大家介绍Java反射的经典实例,帮助大家更好地理解反射的使用方法和作用。

1. 获取类的基本信息

使用Java反射可以获取类的基本信息,如类名、父类、接口、修饰符等,代码如下:

Class clazz = String.class;

// 获取类名
System.out.println("类名:" + clazz.getName());

// 获取父类
System.out.println("父类:" + clazz.getSuperclass().getName());

// 获取接口
Class[] interfaces = clazz.getInterfaces();
System.out.print("接口:");
for (Class i : interfaces) {
    System.out.print(i.getName() + " ");
}
System.out.println();

// 获取修饰符
int modifiers = clazz.getModifiers();
System.out.println("修饰符:" + Modifier.toString(modifiers));

2. 获取构造函数并创建实例

使用反射可以获取类的构造函数,从而在程序运行时动态地创建类的实例,代码如下:

Class clazz = String.class;

// 获取构造函数并创建实例
Constructor constructor = clazz.getConstructor(String.class);
String str = (String) constructor.newInstance("Hello, World!");

System.out.println(str);

3. 获取属性并设置属性值

Java反射可以获取类的属性,从而在程序运行时动态地设置属性值,代码如下:

Class clazz = String.class;

// 获取属性并设置属性值
Field field = clazz.getDeclaredField("value");
field.setAccessible(true);
char[] charValue = (char[]) field.get(str);
charValue[0] = 'J';
charValue[1] = 'a';
charValue[2] = 'v';
charValue[3] = 'a';

System.out.println(str);

4. 获取方法并调用方法

Java反射可以获取类的方法并调用方法,代码如下:

Class clazz = String.class;

// 获取方法并调用方法
Method method = clazz.getMethod("substring", int.class);
String result = (String) method.invoke(str, 7);

System.out.println(result);

5. 动态代理

Java反射还可以用于动态代理,即在程序运行时动态地生成代理类,代码如下:

public interface Hello {
    void sayHello();
}

public class HelloImpl implements Hello {
    @Override
    public void sayHello() {
        System.out.println("Hello, World!");
    }
}

public class HelloHandler implements InvocationHandler {
    private Object target;

    public HelloHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before");
        Object result = method.invoke(target, args);
        System.out.println("After");
        return result;
    }
}

public static void main(String[] args) {
    Hello hello = new HelloImpl();
    Hello proxyHello = (Hello) Proxy.newProxyInstance(
            hello.getClass().getClassLoader(),
            hello.getClass().getInterfaces(),
            new HelloHandler(hello)
    );
    proxyHello.sayHello();
}

以上就是Java反射的经典实例,这些实例展示了反射的使用方法和作用,希望能够帮助读者更好地理解Java反射的相关知识。