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反射的相关知识。
