Java反射
通过Java反射机制,可以在程序中访问已经装载到JVM中的java对象的描述,实现访问、检测和修改描
述Java对象本身信息的功能。简单来说,即拥有任何一个类,获取类中信息的一套机制。
获取类claas对象示例
ReflectTest reflectTest = new ReflectTest();
Class reflect = reflectTest.getClass(); // 获得class对象
// 或者
Class<ReflectTest> reflectTestClass = ReflectTest.class; // 获得class对象
反射常用API方法清单
带declared的方法,获取class类中的类型,不带的则返回父类和子类中所有的类型
例如:
ReflectTest reflectTest = new ReflectTest();
Class reflect = reflectTest.getClass();
Method[] methods = reflect.getMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
System.out.println("===============获取DeclaredMethods");
Method[] declaredMethods = reflect.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod.getName());
}
/**
* main
* wait
* wait
* wait
* equals
* toString
* hashCode
* getClass
* notify
* notifyAll
* ===============获取DeclaredMethods
* main
*/
访问方法,简单示例
public class LionDemo{
private String str;
private int num, qty;
public LionDemo() {
}
public LionDemo(String str, int num, int qty) {
this.str = str;
this.num = num;
this.qty = qty;
}
public LionDemo(String... strings) {
if (0 < strings.length) {
num = Integer.parseInt(strings[0]);
}
if (1 < strings.length) {
num = Integer.parseInt(strings[1]);
}
if (2 < strings.length) {
qty = Integer.parseInt(strings[2]);
}
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getQty() {
return qty;
}
public void setQty(int qty) {
this.qty = qty;
}
}
public class ConstructorLion {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
LionDemo lionDemo = new LionDemo("字符串1", 1, 2);
Class<? extends LionDemo> demoClass = lionDemo.getClass();
// 构造方法
Constructor<?>[] declaredConstructors = demoClass.getDeclaredConstructors();
for (Constructor<?> constructor : declaredConstructors) {
System.out.println( "是否允许带有可变数量的参数:" + (constructor.isVarArgs() ? "是" : "否"));
// 参数类型
Class<?>[] parameterTypes = constructor.getParameterTypes();
List<Class<?>> classes = Arrays.asList(parameterTypes);
classes.forEach(i -> System.out.println(i+","));
}
// 获取成员变量
Field[] declaredFields = demoClass.getDeclaredFields();
for (Field field : declaredFields) {
field.setAccessible(true);
Class<?> type = field.getType();
if (type.equals(int.class)){
field.set(lionDemo, (int) (Math.random() * 10));
}
if (type.equals(String.class)){
field.set(lionDemo, StringUtils.getRandomStr(3));
}
Object numValue = field.get(lionDemo);
System.out.println(field.getName()+"字段值:"+numValue);
}
}
}