JAVA编程不能不知道的反射用法总结
什么是反射
反射是Java中的一种特性,它允许程序在运行时检查和操作对象的属性、方法和构造函数。在Java中,可以使用java.lang.reflect包中的类实现反射。
反射用法
获取Class对象
在Java中,每个类都有一个唯一的Class对象,它保存了与类有关的信息。可以通过下面的方法获取某个类的Class对象:
Class clazz = MyClass.class;
Class clazz = myObject.getClass();
Class clazz = Class.forName("com.example.MyClass");
上述代码中,MyClass
代表类名,myObject
是一个实例化的对象,"com.example.MyClass"
是类的全限定名。例如,Class clazz = String.class;
获取了String
这个类的Class对象。
获取类的属性
可以使用getFields()、getDeclaredFields()等方法获取类的属性。getFields()获取类的公共字段(public修饰),getDeclaredFields()获取类中所有的字段。
Field[] fields = MyClass.class.getFields();
for (Field field : fields) {
System.out.println(field.getName());
}
Field[] fields = MyClass.class.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName());
}
获取类的方法
同样可以使用getMethods()、getDeclaredMethods()等方法获取类的方法。getMethods()获取类的公共方法,getDeclaredMethods()获取类中定义的所有方法。
Method[] methods = MyClass.class.getMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
Method[] methods = MyClass.class.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
实例化对象
实例化对象的方式有两种,一种是通过Class的newInstance()方法,另一种是通过Constructor的newInstance()方法。
MyClass obj1 = MyClass.class.newInstance();
Constructor<MyClass> constructor = MyClass.class.getConstructor(String.class);
MyClass obj2 = constructor.newInstance("foo");
调用对象的方法和属性
可以通过Method的invoke()方法调用对象的方法,通过Field的get()和set()方法获取和设置对象的属性。
Method method = MyClass.class.getMethod("sayHello");
Object result = method.invoke(myObject);
Field field = MyClass.class.getField("name");
Object value = field.get(myObject); //获取值
field.set(myObject, "New Name"); //设置值
示例说明
示例一
假设有一个Person类,其中包含name和age属性,以及getName()和setName(String name)方法。可以使用以下代码获取name属性的值并调用setName()方法修改属性值:
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Class clazz = Person.class;
Person p = (Person) clazz.newInstance();
Field field = clazz.getDeclaredField("name");
field.setAccessible(true); //设置为可访问
field.set(p, "John"); //设置name属性值
Method method = clazz.getDeclaredMethod("getName");
String name = (String) method.invoke(p); //调用getName()方法获取属性值
System.out.println(name); //输出"John"
示例二
假设有一个Car类,其中包含startEngine()和stopEngine()方法。可以使用以下代码获取Car类的实例并调用startEngine()方法。
public class Car {
public void startEngine() {
System.out.println("Engine started");
}
public void stopEngine() {
System.out.println("Engine stopped");
}
}
Class clazz = Car.class;
Car car = (Car) clazz.newInstance();
Method method = clazz.getDeclaredMethod("startEngine");
method.invoke(car); //调用startEngine()方法,输出"Engine started"
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA编程不能不知道的反射用法总结 - Python技术站